2011-08-31 57 views
2

这是我的代码:的preg_replace需要帮助的表达

$string = '<a href="http://www.mysite.com/test" class="prevlink">&laquo; Previous</a><a href=\'http://www.mysite.com/test/\' class=\'page\'>1</a><span class=\'current\'>2</span><a href=\'http://www.mysite.com/test/page/3/\' class=\'page\'>3</a><a href=\'http://www.mysite.com/test/page/4/\' class=\'page\'>4</a><a href="http://www.mysite.com/test/page/3/" class="nextlink">Next &raquo;</a>'; 
$string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); 
$string = preg_replace('@(&lt;a).*?(nextlink)@s', '', $string); 
    echo $string; 

我试图删除最后一个环节:

<a href="http://www.mysite.com/test/page/3/" class="nextlink">Next &raquo;</a>'; 

我的电流输出:

">Next &raquo;</a> 

它消除了一切从头开始。 我希望它只能删除strpos,这是可能的preg_replace和如何? 谢谢。

回答

1

一个相当棘手的问题解决

第一关, 的。*?不会像你期待的那样匹配。

它从左边开始找到< a的第一个匹配,然后搜索直到找到nextlink,它实质上是拾取整个字符串。

为正则表达式工作,因为你想,那就需要从右边第一个匹配,并通过串向后工作,发现最小的(非贪婪)比赛

我看不到任何修饰这将做到这一点 ,所以我选择了每一个环节上的回调,这将检查并删除它

<?php 
$string = '<a href="http://www.mysite.com/test" class="prevlink">&laquo; Previous</a><a href=\'http://www.mysite.com/test/\' class=\'page\'>1</a><span class=\'current\'>2</span><a href=\'http://www.mysite.com/test/page/3/\' class=\'page\'>3</a><a href=\'http://www.mysite.com/test/page/4/\' class=\'page\'>4</a><a href="http://www.mysite.com/test/page/3/" class="nextlink">Next &raquo;</a>'; 

echo "RAW: $string\r\n\r\n"; 

$string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); 

echo "SRC: $string\r\n\r\n"; 


    $string = preg_replace_callback(
     '@&lt\;a.+?&lt;/a&gt;@', 
     'remove_nextlink', 
     $string 
    ); 


function remove_nextlink($matches) { 

    // if you want to see each line as it works, uncomment this 
    // echo "L: $matches[0]\r\n\r\n"; 

    if (strpos($matches[0], 'nextlink') === FALSE) { 
     return $matches[0]; // doesn't contain nextlink, put original string back 
    } else { 
     return ''; // contains nextlink, replace with blank 
    } 
}  

echo "PROCESSED: $string\r\n\r\n"; 
+0

感谢您的解释,我必须学习pregEx它似乎非常强大。代码工作,非常感谢。 =) – Muazam

+0

这不是最优雅的解决方案,但它确实有效,编写正则表达式来处理html始终是困难的工作 – bumperbox

1

注意:这不是一个直接的答案,而是另一种方法的建议。

我被告知过一次;如果你能以任何其他方式做到这一点,远离正则表达式。我不是,那是我的白鲸。你听说过phpQuery吗?它是用PHP实现的jQuery,非常强大。它将能够以非常简单的方式做你想做的事。我知道这不是正则表达式,但也许它对你有用。

如果你真的想继续,我可以推荐http://gskinner.com/RegExr/。我认为这是一个很棒的工具。

+0

感谢您的链接。我的问题解决了。 – Muazam