<?php
$s = "<qu>a<qu>b</qu>c</qu>d<qu>e<qu>f<qu>g</qu>h<qu>i</qu>j</qu></qu>";
preg_match_all("/<qu>[^<]+<\/qu>/U",$s,$r);
print_r($r);
?>

解决方案 »

  1.   

    To: xuzuning(唠叨) 
    不行啊!
    如果
    $s = "<qu>a<qu>b<f></qu>c</qu>d<qu>e<qu>f<qu>g</qu>h<qu>i</qu>j</qu></qu>";
    就出错了,不能正确解析出
    “<qu>b<f></qu>”
      

  2.   

    我的意思是包含在"<qu>"和"</qu>"之间的是任意字符串(无换行符),但是该任意字符串中不允许包含"<qu>"或"</qu>"子串。
      

  3.   

    preg_match_all("|<qu>[^\n]+</qu>|",$s,$r);那 取消贪婪模式 就可以了
      

  4.   

    取消贪婪模式也不行啊,只能保证后面的"</qu>"不被重复,前面的"<qu>"仍然会被包含进来
      

  5.   

    楼主想取的是离</qu>最近的那个<qu>到</qu>的之吧,那样的话比较复杂,效率也不怎么样.
      

  6.   

    还有一个问题:
    要求匹配如下类型的字符串
    "<x>?</x>"
    "<x>?<x>?</x>?</x>"
    "<x>?<x>?<x>?</x>?</x>?</x>"
    等等……
    打开标记和关闭标记之间可以出现任意字符串(我用"?"表示任意字符串,包括空串),
    并且打开标记和关闭标记可以嵌套任意多层。