我想在类似下面的字符串中仅搜索标红的那些字符中的某一字符串keyword。
abcdefg mp lt gt<inline><label>abcdefg</label><load xf "abcdefghigk"></load></inline>sdfsdfsdfsdfsdf &amp; &lt; &gt;abcdefg mp lt gt
即排除
<inline>.....</inline>
&amp;
&lt;
&gt;比如keyword=a时,仅检索标红的字符串中的a,而不会将上述排除的选项中的a检索到。

解决方案 »

  1.   


    ([\w\s]+)<inline>[\s\S]+</inline>([\w]+)
      

  2.   


    怎么没有keyword信息呢?
    keyword时可变的
      

  3.   

    整个完整的字符串就是你贴出来这些?
    你找到字符串的特定规则正则才好用。
    像你的问题,用strip_tags去掉标签,再str_replace替换那几个&amp;&lt;&gt
      

  4.   


    整个完整的字符串不是固定的。每次都可能不一样,甚至有可能不出现上述&amp;等。
    我只是想找到排除上述情况的keyword,然后替换成类似<a>keyword</a>的字符串。
    我打算用preg_replace_callback,所以唯一的难点就在如何写一正则表达式提取到满足条件的keyword。
      

  5.   


    $html = <<<HTML
    abcdefg mp ZT lt a gt<inline><label>abcmpdefg</label>
    <load xf "abcdefghigk"></load></inline>sdfsdfsdmpfsdZTfsdf &amp; &lt; &gt;abcdefg mZTp lt gtmp sfasfs
    HTML;$keyword = 'ZT';
    $str = preg_replace('/&\w{2,4};/i', '', $html);
    $pat = sprintf('/(.*?%s.*?)?(<.*>)(.*?%s.*)*/is',$keyword,$keyword);
    $t = preg_replace_callback($pat, 'foo', $str);
    function foo($matches){
    global $keyword;
    array_shift($matches);
    $t = array_splice($matches, 1,1);
    $ret = str_replace($keyword, "<a href='#'>$keyword</a>", $matches);
    array_splice($ret, 1,0,$t);
    return implode('', $ret);
    }
    echo $t;
    /*
    abcdefg mp <a href='#'>ZT</a> lt a gt<inline><label>abcmpdefg</label>
    <load xf "abcdefghigk"></load></inline>sdfsdfsdmpfsd<a href='#'>ZT</a>fsdf   abcdefg m<a href='#'>ZT</a>p lt gtmp sfasfs
     */只针对该类型数据
      

  6.   


    你这样 应该会把&amp;等所有类似的string都去掉吧?这样是不符合要求的。我们需要不变动任何其他字符。
      

  7.   

    你可以把替换操作去掉
    $keyword = 'ZT';
    //$str = preg_replace('/&\w{2,4};/i', '', $html);
    $pat = sprintf('/(.*?%s.*?)?(<.*>)(.*?%s.*)*/is',$keyword,$keyword);
    $t = preg_replace_callback($pat, 'foo', $html);
      

  8.   

    就是在不固定的字符串s中找出不确定的keyword,且排除
    <inline>.....</inline>
    &amp;
    &lt;
    &gt;最终目的是替换这些keyword