2013-11-14 4 views
2

Я пытаюсь использовать REGEX для разделения строки при сохранении разделителей. Я хочу разделить очень большую и непредсказуемую строку друг с другом с помощью якорных тегов. Я использую HTML аккуратно, чтобы теги были правильными, однако все могло появиться до или после тега привязки, который я хочу сопоставить.PHP Regex Match Anchor Tag

*PRECEDING-ANYTHING*<a *ANYTHING*>*ANYTHING*</a>*PROCEDING-ANYTHING* 
*PRECEDING-ANYTHING*<a *ANYTHING*>*ANYTHING*</a>*PROCEDING-ANYTHING* 

, где URL-адрес href может быть любым, и дополнительные атрибуты, такие как «цель», также могут быть любыми.

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

Использование

$parts= preg_split($pattern, $textWithAnchors, -1, PREG_SPLIT_DELIM_CAPTURE) 

Я надеялся иметь $ частей быть похожи на следующее.

parts[0] is equal to *PRECEDING-ANYTHING* 
parts[1] is equal to <a *ANYTHING*>*ANYTHING*</a> 
and so forth 

Важно, чтобы регулярное выражение фиксировало все якорные метки и все внутри.

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

+3

Пожалуйста, посмотрите на класс 'DOMDocument', это гораздо более практичный и поддерживает загрузку частичного кода. Вы можете легко загрузить одну из своих строк и позволить ей находить все 'a'-теги. –

+0

Посмотрите первый ответ здесь: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

Показать какое-то из регулярных выражений, которые вы пробовали. –

ответ

1

Использование PREG_SPLIT_DELIM_CAPTURE не поможет, потому что возвращает текст захваченного в группе 1-разделителем регулярное выражение как отдельный элемент, но вы хотите разделители быть включены с элементами.

Чтобы указать разделители, не потреблять вход, использовать регулярное выражение выглядеть обходные.
Этот код делает работу:

$parts= preg_split('/(?=<a)|(?<=\/a>)/', $textWithAnchors); 

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

См. live demo настоящего кода, разбивая ваш пример по мере необходимости.