Какое выражение регулярного выражения следует использовать с preg_replace для замены связанного текста? - PullRequest
0 голосов
/ 02 января 2012

G'day,

Я пытаюсь выяснить, как заменить некоторый текст, используя в качестве примера следующее:

Lorem ipsum dolor sit amet, [annotate ref="C1849"]consectetur 
adipisicing elit[/annotate], sed do eiusmod tempor incididunt 
ut labore et [annotate ref="C9437"]dolore[/annotate] magna 
[fred ref="38"]aliqua[/fred].

Текст в [] должен бытьзаменяется в зависимости от значения сразу после открытия [.В этом случае цель состоит в том, чтобы заменить аннотированные теги.Новый текст будет html-тегами, возможно span или аналогичными, а также вставкой некоторых html-атрибутов (class, id и т. Д.).

Я могу заменить [annotate и [/ annotate] через str_replace (),Я также могу заменить все "] с помощью str_replace (). Однако я не хочу заменять все вхождения"] только тогда, когда "] связан с [annotate, поэтому я подумал, что регулярное выражение с preg_replace () будет более подходящимдля замены "].Я играл с lookbehind, пока не понял, что lookbehind имеет дело только со строками фиксированной длины.

Будут благодарны за любые предложения.

1 Ответ

1 голос
/ 02 января 2012

Как правило, использование синтаксического регулярного выражения для анализа XML-данных (теги / закрывающие теги / атрибуты) является плохой идеей: некоторый анализатор DOM намного лучше.

Однако для быстрого и грязногоИсправьте вашу проблему, попробуйте:

$text = 'Lorem ipsum .....';
$patterns = array('/\[annotate([^\]]*)\]/',
                  '/\[\/annotate\]/');
$replacements = array('<span blahablah \1>',
                      '</span>');
echo preg_replace($patterns, $replace, $text);

$patterns имеет первый элемент, являющийся открывающим тегом, а последний - закрывающим тегом.Открывающий тег захватывает все после annotate до соответствующего закрывающего ] и сохраняет его в replacements, используя \1.

Одна из причин, по которой я говорю, что регулярное выражение - не лучшая идея для разбора теговв том, что если annotate содержит блуждающий ], который испортит регулярное выражение.

Например, [annotate extraattribute="alblasd]"] будет обрезан в первом ] вместо второго.

...