#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>
.