2012-11-13 131 views
1

不幸的是,我真的无法绕过正则表达式,所以我最后的手段是要求你的帮助好的人。PHP preg_replace在现有字符串中插入字符串

我有这样的现有代码:

<li id="id-21" class="listClass" data-author="newbie"> 
    <div class="someDiv"> 
     <span class="spanClass">Some content</span> 
    </div> 

    <div class="controls faint"> 
     <a href="link2">Link 2</a> 
     <a href="link3">Link 3</a> 
    </div> 
</li> 

由于一些原因,我不得不使用的preg_replace注入额外的代码块:

<a href="link1">Link 1</a> 

我想你可以猜出这应该去,但为了清楚起见,我的愿望是所得到的字符串看起来像:

<li id="id-21" class="listClass" data-author="newbie"> 
    <div class="someDiv"> 
     <span class="spanClass">Some content</span> 
    </div> 

    <div class="controls faint"> 
     <a href="link1">Link 1</a> 
     <a href="link2">Link 2</a> 
     <a href="link3">Link 3</a> 
    </div> 
</li> 

任何人都可以帮助我用适当的正则表达式来实现这一目标吗?

+0

你更好更精确。你的意思是你只是想在'Link 2'之前插入'Link 1'??? – luiges90

+4

不要使用正则表达式来解析/操作HTML。获取一个合适的HTML解析器。 –

+0

@Alvin Wong True,正则表达式**不能**解析任意的HTML。期。 – luiges90

回答

1

试试这个

$html = '<li id="id-21" class="listClass" data-author="newbie"> 
    <div class="someDiv"> 
     <span class="spanClass">Some content</span> 
    </div> 

    <div class="controls faint"> 
     <a href="link2">Link 2</a> 
     <a href="link3">Link 3</a> 
    </div> 
</li>'; 


$eleName = 'a'; 
$eleAttr = 'href'; 
$eleAttrValue = 'link2'; 
$addBefore = '<a href="link1">Link 1</a>'; 

$result = regexAddBefore($html, $eleName, $eleAttr, $eleAttrValue, $addBefore); 

var_dump($result); 

function regexAddBefore($subject, $eleName, $eleAttr, $eleAttrValue, $addBefore){ 
    $regex = "/(<\s*".$eleName."[^>]*".$eleAttr."\s*=\s*(\"|\')?\s*".$eleAttrValue."\s*(\"|\')?[^>]*>)/s"; 
    $replace = $addBefore."\r\n$1"; 

    $subject = preg_replace($regex, $replace, $subject); 

    return $subject; 
} 
+0

绝对真棒,谢谢。正是我需要的。 – SpongeBobPHPPants

+0

不客气 –

0

我可以建议两件事情(虽然我不能清楚地了解你的问题)

$newStr = preg_replace ('/<[^>]*>/', ' ', $htmlText); 

这将删除字符串中的所有HTML标签。我不知道这对你是否有用。

另一个建议是使用strip_tags函数。 strip_tags的第二个参数是可选的。您可以在第二个参数的帮助下定义要保留的标签。

$str = '<li id="id-21" class="listClass" data-author="newbie"> 
     <div class="someDiv"> 
      <span class="spanClass">Some content</span> 
     </div> 

     <div class="controls faint"> 
      <a href="link2">Link 2</a> 
      <a href="link3">Link 3</a> 
     </div> 
     </li>'; 

echo strip_tags ($str,'<a>'); 

这会给你一个输出,只需要链接和HTML字符串中的任何文本。

对不起,如果这也没有帮助。

+0

不幸的是,我正在使用的软件无法正常工作。你的解决方案肯定会在正常情况下工作,但基本上我正在努力创建一个插件和手动模板编辑不可行。大部分代码是我可以从数据库中提取的原始模板代码,我唯一的选择是制定一些正则表达式来将Link 1代码注入到该代码中。该软件稍后将对其进行解析,并执行所需的任何操作来完成HTML工作。我只需要在那里获得该链接。非常感谢您花时间回复。 – SpongeBobPHPPants

+0

好的,然后看到新的答案。那是你在寻找什么?我试图理解这个问题,但可能是我对它不太好。 – bakyaw