2010-09-01 5 views
0
$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 от всех пролетов с классом данных. Таким образом, он должен вывести:Как вырезать теги в PHP с помощью регулярных выражений?

$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

Если строка содержит больше, чем просто 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) в этом случае:

text text 
google.com 
text yahoo.com text. 
+1

Внутри значения атрибута нет текстового узла. Это должно быть '// span/@ data-url'. – Tomalak

+0

@Tomalak Исправлено. благодаря – Gordon

1

Попробуйте использовать SimpleXML и Еогеасп элементами - проверьте, если class атрибут является действительным, и захватить data-url «s

0
preg_match_all("/data/" data-url=/"([^']*)/i", $string , $urls); 

Вы можете получить все URLS а = этим путем.

И вы также можете использовать SimpleXML, как HSZ упоминается

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^