регулярное выражение - совпадение не в теге - PullRequest
0 голосов
/ 02 декабря 2009

это должно быть легко, но почему-то я не могу понять это: У меня есть фрагмент HTML, как этот: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...

Мне нужно сопоставить номера 1, 20, 30 (только те) и заменить их ссылками. Очевидно, я не хочу заменять числа внутри тега

Вывод должен быть: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some <a href="#20">20</a> text <a href="#1">1</a> <b><a href="#30">30</a></b> with some numbers <a href="#30">30</a> <a href="#20">20</a></p> ...

Вот что у меня есть:

$text = '<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...';

$pat[]  = '/(?<=\>)([^<]*)([^0-9\:])(1|20|30)([^0-9])/s';
$repl[] = '$1$2<a href="#$3" class="p2">$3</a>$4';
echo preg_replace($pat, $repl, $text);

Это работает, но соответствует только одному числу за раз, и я не хочу запускать его в цикле.

Есть идеи?

-

Я вижу смысл в использовании HTML-парсера, однако это похоже на то, что можно сделать с помощью регулярного выражения. Особенно, когда нет стандартной библиотеки для разбора HTML в PHP, и я не уверен, хочу ли я импортировать сторонний анализатор HTML только для этой задачи. Любая попытка исправить мое регулярное выражение?

- Мне удалось написать регулярное выражение, которое работает в моем случае. Если кому-то интересно:

$pat[] = '/>(([^<]*)(([^0-9\:]))|())(1|20|30)(?(?=[<]+?)(?!<\/a>)|(([^0-9\<])([^<]*)<(?!\/a>)))/sU'; $repl[] = '>$1<a href="#$6" class="p22">$6</a>$7';

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

С уважением, Филий

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

Это действительно просто: извлеките только текст с помощью парсера HTML, затем используйте для этого регулярные выражения.

1 голос
/ 02 декабря 2009

Регулярные выражения предназначены для анализа регулярных языков - тех, которые могут быть описаны с помощью конечных автоматов. HTML не является обычным языком. Разбор HTML с помощью регулярных выражений - это способ Ктулху: Синтаксический анализ HTML. Путь Ктулху .

0 голосов
/ 03 декабря 2009

HTML не должен анализироваться с помощью регулярных выражений, потому что это не обычный язык. Вы могли бы сделать это, чтобы правильно сформировать XHTML, но я бы не рекомендовал это делать. См. самый проголосовавший ответ на SO

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