求助:正则嵌套匹配问题 $str = '<a href="http://www.abc.com/"> <a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的智慧 </a> </a> </a>';$rx = "/<a\s+[^<]*?>[^<]*?<\\/a>/i";preg_match($rx, $str, $matches);var_export($matches); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 前面<>里面也是不一定是什么。就是要判断,重复多个相同的,只保留一个。 $str="<a href=\"http://www.abc.com/\"><a href=\"http://www.abc.com/\"> <a href=\"http://www.abc.com/\">提问的智慧 </a> </a> </a> "; $str = preg_replace('/<a\s+href\s*=\s*[\"|\'](.+?)[\"|\']>.+?([^<\/a>]+)(\s*<\/a>\s*)+/is', '<a href="$1">$2</a>' ,$str); echo $str; <div class='cat'><div class='cat'><div class='cat'>提问的智慧</div></div></div> <>也可能是这种,嵌套的东西和个数都不一定,但肯定是一一对应的。 没想到好办法,找高手吧.笨方法就是分别给标签写正则,然后放到数组里.用preg_match($arrPattern, $arrReplace, $str); $str='<a href="http://www.abc.com/"> <a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a> </a>';$str1='<a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a>';$str2='<a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a>';preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str1,$array);preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str2,$array2);preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str3,$array3);print_r($array);print_r($array2);print_r($array3); http://www.x2blog.cn/Maxwin/#sid.17788/page.2/ <a href="http://www.abc.com/">提问的智慧 </a> </a> </a> 或者只匹配中间不是英文的或不含<标签的链接试试<a.*?>[^\<\>]*?</a> 此正则表达式,要求第一层和第二层以及N层的标签必须前后匹配.中间可以有任何空白字符,包括空格、制表符、换页符.不知道能否满足你的要求.$str="<a href='http://www.abc.com/'> <a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a></a><div class='cat'><div class='cat'><div class='cat'>提问的智慧</div></div></div><script><script>asfasdf</script></script>"; $re = "/(\s*<[^<>]*>\s*)+(.*?)(<\/\w+>)+/is";echo preg_replace($re, '$1$2$3', $str);仔细看了一下递归深度匹配,但能力有限,没有找出如何匹配中间内容的方法.$re = "#<([a-z]+) ([^ >]+)[^<>]*>([^<>]|(?R))*</[^<>]+>#is";preg_match_all($re,$str,$matches);var_dump($matches); 上面结果为:<a href='http://www.abc.com/'>提问的智慧 </a><div class='cat'>提问的智慧</div><script>asfasdf</script>array(4) { [0]=> array(2) { [0]=> string(144) "<a href='http://www.abc.com/'> <a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a></a>" [1]=> string(79) "<div class='cat'><div class='cat'><div class='cat'>提问的智慧</div></div></div>" } [1]=> array(2) { [0]=> string(1) "a" [1]=> string(3) "div" } [2]=> array(2) { [0]=> string(26) "href='http://www.abc.com/'" [1]=> string(11) "class='cat'" } [3]=> array(2) { [0]=> string(80) "<a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a>" [1]=> string(56) "<div class='cat'><div class='cat'>提问的智慧</div></div>" }} 用php动态生成pdf的中文乱码问题 翻译软件开发 B/S模式 server版 PHP 按位取反的问题 MYSQL query结果如何自动编号? 请问下 我去掉了程序作者的一个版权和链接 我整个网站就不能运行 请教php正则替换的问题 请大侠指点一个思路 生成静态页面的前台登陆问题???? socket_read的问题!!!!!请高人指点,最好能说一说原理,谢谢! 救急!望php程序员帮忙! 怎么样获取多个同名字的复选框的值? 朋友们,北京见~~~
$str = preg_replace('/<a\s+href\s*=\s*[\"|\'](.+?)[\"|\']>.+?([^<\/a>]+)(\s*<\/a>\s*)+/is', '<a href="$1">$2</a>' ,$str);
echo $str;
<>也可能是这种,嵌套的东西和个数都不一定,但肯定是一一对应的。
笨方法就是分别给标签写正则,然后放到数组里.
用preg_match($arrPattern, $arrReplace, $str);
$str='<a href="http://www.abc.com/"> <a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a> </a>';
$str1='<a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a>';
$str2='<a href="http://www.abc.com/"> <a href="http://www.abc.com/">提问的滋味 </a> </a>';
preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str1,$array);
preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str2,$array2);
preg_match_all('/<a .*>[\x80-\xff]+ <\/a>/',$str3,$array3);
print_r($array);
print_r($array2);
print_r($array3);
试试
<a.*?>[^\<\>]*?</a>
不知道能否满足你的要求.
$str="<a href='http://www.abc.com/'> <a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a></a><div class='cat'><div class='cat'><div class='cat'>提问的智慧</div></div></div><script><script>asfasdf</script></script>";
$re = "/(\s*<[^<>]*>\s*)+(.*?)(<\/\w+>)+/is";
echo preg_replace($re, '$1$2$3', $str);
仔细看了一下递归深度匹配,但能力有限,没有找出如何匹配中间内容的方法.$re = "#<([a-z]+) ([^ >]+)[^<>]*>([^<>]|(?R))*</[^<>]+>#is";
preg_match_all($re,$str,$matches);
var_dump($matches); 上面结果为:<a href='http://www.abc.com/'>提问的智慧 </a><div class='cat'>提问的智慧</div><script>asfasdf</script>array(4) {
[0]=>
array(2) {
[0]=>
string(144) "<a href='http://www.abc.com/'> <a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a></a>"
[1]=>
string(79) "<div class='cat'><div class='cat'><div class='cat'>提问的智慧</div></div></div>"
}
[1]=>
array(2) {
[0]=>
string(1) "a"
[1]=>
string(3) "div"
}
[2]=>
array(2) {
[0]=>
string(26) "href='http://www.abc.com/'"
[1]=>
string(11) "class='cat'"
}
[3]=>
array(2) {
[0]=>
string(80) "<a href='http://www.abc.com/'> <a href='http://www.abc.com/'>提问的智慧 </a></a>"
[1]=>
string(56) "<div class='cat'><div class='cat'>提问的智慧</div></div>"
}
}