2010-11-21 9 views
1

Sagen, ich habe den folgenden Link:Str_replace mit regex

<li class="hook"> 
     <a href="i_have_underscores">I_have_underscores</a> 
</li> 

Wie würde ich, die Unterstrichen entfernen nur im Text und nicht die href? Ich habe str_replace verwendet, aber das entfernt alle Unterstriche, was nicht ideal ist.

<li class="hook"> 
     <a href="i_have_underscores">I have underscores</a> 
</li> 

Jede Hilfe, viel

+0

* (bezogen) * [besten Methoden zu analysieren, HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon

Antwort

2

Es ist sicherer, HTML mit DOMDocument anstelle von Regex zu analysieren. Versuchen Sie diesen Code:

<?php 

function replaceInAnchors($html) 
{ 
    $dom = new DOMDocument(); 
    // loadHtml() needs mb_convert_encoding() to work well with UTF-8 encoding 
    $dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); 

    $xpath = new DOMXPath($dom); 

    foreach($xpath->query('//text()[(ancestor::a)]') as $node) 
    { 
     $replaced = str_ireplace('_', ' ', $node->wholeText); 
     $newNode = $dom->createDocumentFragment(); 
     $newNode->appendXML($replaced); 
     $node->parentNode->replaceChild($newNode, $node); 
    } 

    // get only the body tag with its contents, then trim the body tag itself to get only the original content 
    return mb_substr($dom->saveXML($xpath->query('//body')->item(0)), 6, -7, "UTF-8"); 
} 

$html = '<li class="hook"> 
     <a href="i_have_underscores">I_have_underscores</a> 
</li>'; 
echo replaceInAnchors($html); 
6

geschätzt Sie einen HTML DOM parser verwenden können den Text innerhalb der Tags zu bekommen, und dann str_replace() Funktion laufen auf:

Also im Grunde möchte ich mit diesem Ausgang gelassen werden das Ergebnis.


Mit dem DOM Parser I verbunden sind, es als so etwas wie dies so einfach ist:

$html = str_get_html(
    '<li class="hook"><a href="i_have_underscores">I_have_underscores</a></li>'); 
$links = $html->find('a'); // You can use any css style selectors here 

foreach($links as $l) { 
    $l->innertext = str_replace('_', ' ', $l->innertext) 
} 

echo $html 
//<li class="hook"><a href="i_have_underscores">I have underscores</a></li> 

Das ist es.

+0

Danke, welchen Teil der Seite sollte ich mir ansehen? –

+0

Auf der ersten Seite werden Sie die beiden Links unter "Download and Documentation" sehen wollen. – BudgieInWA

+0

Es ist viel langsamer (30ms vs. 1ms auf meinem Rechner) als stillstanding Lösung, die für mich der beste Ansatz zu sein scheint (aber mit ' "// text() [(Vorgänger :: a)]" 'xPath-Abfrage). –