2010-11-21 2 views
1

Скажем, у меня есть по следующей ссылке:str_replace с регулярным выражением

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

Как бы я, удалить подчеркивание в тексте только и не HREF? Я использовал str_replace, но это удаляет все подчеркивания, что не является идеальным.

Поэтому в основном я бы ушел с этого выхода:

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

Любая помощь, высоко ценится

+0

* (связанные) * [Лучшие методы для разбора HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon

ответ

2

Безопаснее анализировать HTML-код с помощью DOMDocument вместо регулярного выражения. Попробуйте этот код:

<?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

Вы можете использовать HTML DOM parser, чтобы получить текст в тегах, а затем запустить str_replace() функцию результат.


Использование DOM Parser Я связала, это так просто, как что-то вроде этого:

$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> 

Вот и все.

+0

Спасибо, на какой части сайта я должен смотреть? –

+0

На первой странице вы захотите проверить две ссылки в разделе «Загрузка и документация» – BudgieInWA

+0

Это медленнее (30 мс против 1 мс на моей машине), чем решение stillstanding, которое, кажется, лучший подход ко мне (но с ' "// text() [(ancestor :: a)]" 'xPath query). –

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