Скажем, у меня есть следующая ссылка:
<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>
Вот и все.