Что делает это регулярное выражение - PullRequest
3 голосов
/ 08 декабря 2008
$pee = preg_replace( '|<p>|', "$1<p>", $pee );

Это регулярное выражение взято из исходного кода Wordpress (formatting.php, функция wpautop); Я не уверен, что он делает, кто-нибудь может помочь?

На самом деле я пытаюсь перенести эту функцию на Python ... если кто-нибудь уже знает о существующем порте, это было бы намного лучше, так как я очень плохо отношусь к регулярному выражению.

Ответы [ 9 ]

3 голосов
/ 08 декабря 2008

Функция preg_replace () - несколько сбивающая с толку - позволяет использовать другие разделители, кроме стандартного "/", для регулярных выражений, поэтому

"|<p>|"

Было бы регулярным выражением, совпадающим с

"<p>" 

в тексте. Тем не менее, я не ясно, что параметр замены

"$1<p>" 

будет делать, так как нет группировки для сопоставления с $ 1. Казалось бы, как дано, это просто замена тега абзаца пустой строкой, за которой следует тег абзаца, и фактически ничего не делающего.

Кто-нибудь с более глубоким знанием особенностей PHP имеет лучший анализ?

3 голосов
/ 08 декабря 2008

WordPress действительно называет переменную "Пи"?

Я не уверен, что означает $ 1 (в первом параметре нет фигурных скобок?), Поэтому я не думаю, что это действительно что-то делает, но я могу ошибаться.

2 голосов
/ 08 декабря 2008

Символы трубы | в этом случае не имеют значения по умолчанию «соответствовать тому или другому», но используются в качестве альтернативных разделителей для шаблона вместо более распространенных косых черт /. Это может иметь смысл, если вы хотите совпадать с / без необходимости избегать этих появлений (например, /(.\*)\/(.\*)\// не так читабельно, как #/(.\*)/(.\*)/#). Кажется, довольно непродуктивно использовать вместо этого |, который является еще одним зарезервированным символом для паттернов.

Обычно $1 в шаблоне замены должно соответствовать первой группе, обозначенной скобками. Например, если у вас есть шаблон как

"(.*)<p>"

$0 будет содержать все совпадение, а $1 часть до &lt;p&gt;.

Поскольку данный reg-ex не объявляет какие-либо группы и $1 не является допустимым именем для переменной (в PHP4), определенной в другом месте, этот вызов, кажется, заменяет любые вхождения &lt;p&gt; на &lt;p&gt;?

Если честно, теперь я тоже в замешательстве. Просто предположение: получает другой метод сопоставления с образцом (preg_match и тому подобное), вызываемый перед данной строкой, так что $1 оттуда "просочилась"?

2 голосов
/ 08 декабря 2008

...

На самом деле, похоже, что он берет первый тег <p> и добавляет к нему первое совпадение предыдущего регулярного выражения (поскольку в этом нет совпадений),

Тем не менее, кажется, что это поведение, мягко говоря, плохое, поскольку нет никакой гарантии, что функции preg_ * не будут поглощать $ 1 своими собственными значениями.

Редактировать: Судя по комментарию Джея, это регулярное выражение на самом деле ничего не делает.

0 голосов
/ 13 декабря 2008

Регулярное выражение просто соответствует буквальному тексту

. Выбор ограничивать регулярное выражение вертикальной чертой вместо косой черты весьма неудачен. Это не меняет код, но затрудняет чтение. (Это также делает невозможным использование оператора чередования в регулярном выражении.)

$ 1 не является допустимым именем переменной в PHP, поэтому $ 1 никогда не интерполируется в двойных кавычках. $ 1 передается в preg_replace без изменений. preg_replace анализирует строку замены и заменяет $ 1 содержимым первой группы захвата. Если нет группы захвата, $ 1 заменяется ничем.

Таким образом, этот код делает то же самое, что и:

$pee = preg_replace( '/<p>/', "<p>", $pee );

Это не правильно, что это ничего не делает. Поиск и замена будут выполняться, замедляя работу вашего программного обеспечения и занимая память для временных копий $ pee.

0 голосов
/ 08 декабря 2008

Я верю, что линия ничего не делает.

Для чего это стоит, это предыдущая строка, в которой установлен $ 1:

$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);

Тем не менее, я не думаю, что это чего-то стоит. В моем тестировании $ 1 не поддерживает значение от одного preg_replace до следующего, даже если следующий не устанавливает свое собственное значение для $ 1. Помните, что имена переменных PHP не могут начинаться с цифры (см .: http://php.net/language.variables), поэтому $ 1 не является переменной PHP. Это означает только что-то в пределах одного preg_replace, и в этом случае правила preg_replace предполагают, что это ничего не значит.

Тем не менее, autop, являющийся такой широко используемой функцией, заставляет меня усомниться в моем собственном заключении, что эта строка ничего не делает. Поэтому я с нетерпением жду, когда кто-нибудь исправит меня.

0 голосов
/ 08 декабря 2008

У меня нет большого опыта работы с RegEx, и у меня нет инструмента тестирования RegEx на мне, но после некоторого поиска и просмотра другого исходного кода и комментариев WordPress, возможно ли, что этот код удаляет дубликаты тегов абзаца заменяет их одним набором тегов.

0 голосов
/ 08 декабря 2008

Я очень рекомендую удивительные RegexBuddy

0 голосов
/ 08 декабря 2008

заменяет совпадение с шаблоном

"|<p>|" 

по строке

"$1<p>"

| в схеме замены это заставляет двигатель регулярных выражений соответствовать либо части на левой стороне, либо части на правой стороне.

Я не понимаю, почему он так используется, потому что обычно это что-то вроде "ta (b | p) e" ...

Для $ 1, я думаю, переменная $ 1 находится в PHP-коде и заменяется во время preg_replace, так что если $ 1 = "test"; замена заменит

"<p>" 

до

"test<p>"

Но я не уверен в этом за $ 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...