Я хотел бы заменить строки кода на предварительный код в тексте в PHP

#php #regex #preg-replace #syntax-highlighting

#php #регулярное выражение #preg-replace #подсветка синтаксиса

Вопрос:

Я хотел бы заменить строки кода на предварительный код в тексте.

например, в тексте:

 @PHP    

public function example()
{
    echo "Hello World.";
}

   

@JS    

alert("Hello World!");

   
 

заменить на:

 <pre class="PHP">

public function example()
{
    echo "Hello World.";
}

</pre>

<pre class="JS">

alert("Hello World!");

</pre>
 

мое состояние сейчас:

 public function decorate( $str = "" )
{
    $str = htmlspecialchars($str, ENT_QUOTES, "utf-8", false);
    $str = str_replace("t","amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;",$str);
    $str = str_replace(" ","amp;nbsp;",$str);
    $str = preg_replace("/@(. ?)   (.*)   /is", "<pre class='$1'>$2</pre>", $str);
    $str = nl2br($str);

    return $str;
}
 

проблема 1: Дубликат разрыва строки в «pre» из функции «nl2br» работает.
проблема 2: регулярное /@(. ?) (.*) /is выражение неверно.

Вы знаете правильный способ?
Это хорошо, даже если есть другой способ.

Ответ №1:

В соответствии с выводом этой живой демонстрации php

Используйте это:

 $replaced = preg_replace('~(?sm)^@(S )[ ]*(   )(.*?)2~',
                         '<pre class="$1">$3</pre>',
                         $yourstring);
 

Когда вы проверяете замену, обязательно просмотрите ее через htmlentities, иначе разметка не будет отображаться. Например: echo htmlentities($replaced);

Объяснение

  • (?sm) активирует DOTALL и многострочные режимы, позволяя точкам соответствовать новым строкам и ^ совпадать при разрывах строк
  • ^ Привязка утверждает, что мы находимся в начале строки
  • @ соответствует литералу @
  • (S ) записывает любые символы, не содержащие пробелов, в группу 1
  • [ ]* необязательно соответствует пробелам
  • ( ) соответствует трем плюсам и записывает их в группу 2 (поэтому нам не нужно вводить его снова)
  • (.*?) лениво сопоставляет и записывает в группу 3 все символы до…
  • 2 Обратная ссылка, которая
  • Мы заменяем на <pre class="$1">$3</pre> , где $1 обозначает группу 1, и так далее.

Вывод

 <pre class="PHP">

public function example()
{
    echo "Hello World.";
}

</pre>

<pre class="JS">

alert("Hello World!");

</pre>
 

Комментарии:

1. К вашему сведению: исправлена ошибка, добавлена живая демонстрация PHP. 🙂

2. Спасибо, увидимся в следующий раз! 🙂

Ответ №2:

Ваш php-код будет,

 <?php
$string = <<<EOT
@PHP    

public function example()
{
    echo "Hello World.";
}

   

@JS    

alert("Hello World!");

   
EOT;
$regex = array('~@(w )s*   ~','~   ~');
$replace = array(
  '<pre class="1">',
  '</pre>'
);
$result = preg_replace($regex,$replace,$string);
echo $result;
?>
 

Вывод:

 <pre class="PHP">

public function example()
{
    echo "Hello World.";
}

</pre>

<pre class="JS">

alert("Hello World!");

</pre>
 

ДЕМОНСТРАЦИЯ

Объяснение:

  • @(w )s* Фиксируется один или несколько символов слова @ , за которыми следует символ, который имеет конец. И соответствующая целая строка заменяется на <pre class="1"> . 1 представляет собой 1-ю захваченную группу.
  • ~ ~ Строка, состоящая всего из трех символов, заменяется на </pre> .