查找并替换可能部分位于html标记内的字符串

时间:2012-06-13 08:46:13

标签: php html regex preg-replace html-parsing

有人可以提出以下可能的解决方案。

例如,我有一串文字“Suspendisse potential”。

我需要在字符串中搜索一些html并将其包装在span标记中:

这样

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse potenti. In sed mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

会变成

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
<span class="search-match" id="search-term-0">Suspendisse potenti</span>. 
In sed mauris vel nibh dapibus pellentesque eu id dolor. Morbi dictum 
quam eleifend ante mattis rutrum. Mauris nisl ligula, consectetur eget 
gravida vel, varius vel metus. Nullam a ante metus.</p>

我使用此工作:$text = preg_replace_callback( '/(' . preg_quote($searchTerm, '/') . '*)/', "Search::addSearchId", $text );

我遇到的问题是我正在搜索的文本中的部分字符串是否为html标记。

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse <a href="/link">potenti</a>. In sed mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

或标签中的搜索字词和额外文字

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse <a href="/link">potenti In sed</a> mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

这显然错过了文本,因为它只搜索没有任何标签的普通字符串。

是否有人有任何方便的正则表达式可以匹配普通字符串以及带有html的字符串?

这是在从搜索页面引用后在页面顶部创建一些锚点,我想突出显示搜索词,所以我需要包装整个字符串。

1 个答案:

答案 0 :(得分:3)

试试这个

$result = preg_replace_callback('%\b(Suspendisse potenti)(?!</\w+)\b%im', 'compute_replacement', $subject);

function compute_replacement($groups) {
    // You can vary the replacement text for each match on-the-fly
    // $groups[0] holds the regex match
    // $groups[n] holds the match for capturing group n
    return '<span>$1</span>';
}