Как удалить теги в PHP с помощью регулярных выражений? - PullRequest
0 голосов
/ 01 сентября 2010
$string = 'text <span style="color:#f09;">text</span>
<span class="data" data-url="http://www.google.com">google.com</span>
text <span class="data" data-url="http://www.yahoo.com">yahoo.com</span> text.';

Я хочу получить URL-адрес данных из всех диапазонов с классом data . Итак, он должен вывести:

$string = 'text <span style="color:#f09;">text</span>
http://www.google.com text http://www.yahoo.com text.';

А затем я хочу удалить все оставшиеся html-теги .

$string = strip_tags($string);

Выход:

$string = 'text text http://www.google.com text http://www.yahoo.com text.';

Может кто-нибудь сказать, пожалуйста, как это можно сделать?

Ответы [ 4 ]

4 голосов
/ 01 сентября 2010

Если ваша строка содержит не только показанный вами фрагмент HTML, вам следует использовать DOM с этим XPath

//span/@data-url

Пример:

$dom = new DOMDocument;
$dom->loadHTML($string);
$xp = new DOMXPath($dom);
foreach( $xp->query('//span/@data-url') as $node ) {
    echo $node->nodeValue, PHP_EOL;
}

Приведенное выше будет выводить

http://www.google.com
http://www.yahoo.com

Когда вы уже загрузили HTML, вы также можете сделать

echo $dom->documentElement->textContent;

, который возвращает тот же результат, что и strip_tags($string) в этомcase:

text text
google.com
text yahoo.com text.
1 голос
/ 01 сентября 2010

Попробуйте использовать SimpleXML и foreach по элементам - затем проверьте, является ли атрибут class допустимым, и возьмите data-url '*

0 голосов
/ 01 сентября 2010

Короткий ответ: не надо. Вокруг SO есть прекрасная напыщенная речь, объясняющая, почему анализ html с регулярными выражениями - плохая идея. По сути, это сводится к тому, что «html не является регулярным языком, поэтому регулярные выражения не подходят для его анализа». Что вам нужно, это что-то, что знает DOM.

Как сказал @hsz, SimpleXML - хороший вариант, если вы знаете, что ваш html проверяется как XML. Лучше может быть DOMDocument :: loadHTML , который не требует хорошо сформированного HTML. Как только ваш HTML-объект находится в объекте DOMDocument, вы можете легко извлечь то, что вам нужно. Проверьте документы здесь .

0 голосов
/ 01 сентября 2010
preg_match_all("/data/" data-url=/"([^']*)/i", $string , $urls);

Таким способом вы можете получить все URls a =.

И вы также можете использовать simplexml в качестве hsz упомянутого

...