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> 

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

Безопаснее анализировать 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); 

Вы можете использовать парсер HTML DOM, чтобы получить текст в тегах, а затем запустите 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> 

Вот и все.