Pergunta

$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.';

O que eu quero fazer é obter o Data-URL De todos os vãos com a classe dados. Então, ele deve produzir:

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

E então eu quero remover todo o restante Tags HTML.

$string = strip_tags($string);

Resultado:

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

Alguém pode me dizer como isso pode ser feito?

Foi útil?

Solução

Se sua string contiver mais do que apenas o snippet html que você mostra, você deve usar Dom com isso Xpath

//span/@data-url

Exemplo:

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

O exposto acima iria produzir

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

Quando você já tem o HTML carregado, você também pode fazer

echo $dom->documentElement->textContent;

que retorna o mesmo resultado que strip_tags($string) nesse caso:

text text
google.com
text yahoo.com text.

Outras dicas

Tente usar SimpleXML e foreach by the Elements - então verifique se class atributo é válido e pegue o data-url's

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

Você pode buscar todos os URLs a = dessa maneira.

E você também pode usar simplexml como HSZ mencionado

A resposta curta é: não. Há um discurso adorável em algum lugar por aí, explicando por que analisar o HTML com Regexes é uma má idéia. Essencialmente, se resume a 'HTML não é um idioma regular, para que expressões regulares não sejam adequadas para analisá -lo'. O que você precisa é de algo ciente.

Como o @HSZ disse, o simplexml é uma boa opção se você souber que seu HTML valida como XML. Melhor pode ser DomDocument :: loadHtml que não requer HTML bem formado. Depois que seu HTML estiver em um objeto DomDocument, você poderá extrair o que será com muita facilidade. Confira os documentos aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top