我想在类似下面的字符串中仅搜索标红的那些字符中的某一字符串keyword。
abcdefg mp lt gt<inline><label>abcdefg</label><load xf "abcdefghigk"></load></inline>sdfsdfsdfsdfsdf & < >abcdefg mp lt gt
即排除
<inline>.....</inline>
&
<
>比如keyword=a时,仅检索标红的字符串中的a,而不会将上述排除的选项中的a检索到。
abcdefg mp lt gt<inline><label>abcdefg</label><load xf "abcdefghigk"></load></inline>sdfsdfsdfsdfsdf & < >abcdefg mp lt gt
即排除
<inline>.....</inline>
&
<
>比如keyword=a时,仅检索标红的字符串中的a,而不会将上述排除的选项中的a检索到。
([\w\s]+)<inline>[\s\S]+</inline>([\w]+)
怎么没有keyword信息呢?
keyword时可变的
你找到字符串的特定规则正则才好用。
像你的问题,用strip_tags去掉标签,再str_replace替换那几个&<>
整个完整的字符串不是固定的。每次都可能不一样,甚至有可能不出现上述&等。
我只是想找到排除上述情况的keyword,然后替换成类似<a>keyword</a>的字符串。
我打算用preg_replace_callback,所以唯一的难点就在如何写一正则表达式提取到满足条件的keyword。
$html = <<<HTML
abcdefg mp ZT lt a gt<inline><label>abcmpdefg</label>
<load xf "abcdefghigk"></load></inline>sdfsdfsdmpfsdZTfsdf & < >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
*/只针对该类型数据
你这样 应该会把&等所有类似的string都去掉吧?这样是不符合要求的。我们需要不变动任何其他字符。
$keyword = 'ZT';
//$str = preg_replace('/&\w{2,4};/i', '', $html);
$pat = sprintf('/(.*?%s.*?)?(<.*>)(.*?%s.*)*/is',$keyword,$keyword);
$t = preg_replace_callback($pat, 'foo', $html);
<inline>.....</inline>
&
<
>最终目的是替换这些keyword