2010-09-27 33 views
2

我需要在打开的锚点结束后(锚点内容开始的地方)直接插入一个字符串。Regexp在锚标记的开始处插入字符串?

这里是我的代码:

<ul id="menu-topmenu2" class="menu"> 
    <li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5"> 
     <a href="http://localhost/domain/barnlager.se/?page_id=2"> 
      About 
     </a> 
    </li> 
    <li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5"> 
     <a href="http://localhost/domain/barnlager.se/?page_id=2"> 
      Services 
     </a> 
    </li> 
</ul> 

在这个例子中,我需要的内容之前, “关于” 和 “服务”。一个简短的正则表达式应该做到这一点?上面的HTML代码可以是一个名为$ content的字符串。

我使用PHP。谢谢!

+0

你为什么用javascript标记它? – Gumbo 2010-09-27 13:29:33

+3

删除了js标签。这里没有涉及任何JavaScript。此外,你将得到大约50个答案,告诉你不要用Regexp解析HTML。有人甚至可以解释为什么。他们都会是正确的,顺便说一句 - 你不应该使用Regexp来解析HTML **,除非你只有一个特定的HTML文件被锁定的子集,你会解析。 – Stephen 2010-09-27 13:33:04

+0

斯蒂芬,你会如何解决它?抱歉关于Javascript标记,有人为我移除它。 – 2010-09-27 13:37:20

回答

3

我会使用的解析器,DOM例如:

$content = '...your html string...'; 
$doc = new DOMDocument(); 
$doc->loadHTML('<html><body>'.$content.'</body></html>'); 
$x = new DOMXPath($doc); 
foreach($x->query('//a') as $anchor){ 
    // strrev(trim($anchor->nodeValue))) is just an example. put anything you like. 
    $anchor->insertBefore(new DOMText(strrev(trim($anchor->nodeValue))),$anchor->firstChild); 
} 
echo $doc->saveXML($doc->getElementsByTagName('ul')->item(0)); 

而作为一个额外的好处,它抛出你已经在你的HTML,这是无效的定义id="menu-item-5"两次警告。

+0

差不多就像我编码一样。你的情况可能会更好? $ dom = new DOMDocument(); \t $ dom-> loadHTML($ content); $ xpath = new DomXPath($ dom); \t $ tag = $ dom-> getElementsByTagName(“a”); \t $ counter = $ tag-> length; ($ i = 0; $ i <$ counter; $ i ++){ \t { \t \t $ result = $ tag-> item($ i) - > nodeValue; \t \t $ content = str_replace($ result,''。$ result,$ content); \t} – 2010-09-27 18:35:23

+1

getElementsByTagName实际上可以更快,并且完全不需要DOMXPath。然而,我不会尝试在原始内容上使用'str_replace':首先,'DOMDocument'具有翻译实体的诀窍,其次:它绝不保证你的'$ result'不会真的出现在别的地方,导致替换不当。如果你已经有了'DOM'中的东西,只需在适当的位置添加一个DOM功能的DOMElement即可。 – Wrikken 2010-09-27 18:47:26

+0

你错过了a)的foreach。修复它,我会对这篇文章进行绿色检查。 顺便提一下这个问题: http://stackoverflow.com/questions/4660962/xpath-insert-before-and-after-with-dom-and-php – 2011-01-11 18:53:48

1

您可以用/<a.*?>/i找到每个锚标签。如果您想在此之后替换某个内容,则该调用看起来像preg_replace("/(<a.*?>)/", '$1YOUR ADDITIONAL TEXT', $content)

如果因为某种原因需要双引号字符串作为替换参数,请确保反斜杠转义$1