2012-06-13 25 views
3

有没有人可以为以下内容提出可能的解决方案。查找并替换可能部分位于html标记内的字符串

例如,我有一个字符串“Suspendisse potenti”。

我需要寻找一些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);

我遇到的问题是当字符串的一部分在th我正在搜索的文本是在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

你有什么期望在这种情况下'Suspendisse potenti In sed'做?在'Suspendisse'之前开始跨度并在''之间关闭是不可能的 – maxdec

+0

也许在输入文本中,而不是'$ text',使用'strip_tags($ text)',并让我知道这是怎么回事。 –

回答

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>'; 
}