regex – совпадение не в теге

это должно быть легко, но почему-то я не могу понять: у меня есть фрагмент 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-парсер только для этой задачи. Любая попытка исправить мое регулярное выражение?

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

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

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

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

Related of "regex – совпадение не в теге"