尝试接受大段落字符串并格式化关键字。我的代码如下:
function envisio($content){
$env = '/(\s)+( (WORD|word|Word)(\s)?(AB|ab|Ab) )(\s)+/';
$new = preg_replace ($env , '<span class="word">Word</span><span class="abb">AB</span>', $content);
return $new;
}
我正在尝试捕获所有出现的“WordAB”(WORDAB,WORD AB,WordAB,Word AB等)并替换为格式化的html字符串。但是,该功能没有发现任何事件。我的正则表达式中缺少这个错误吗?
答案 0 :(得分:1)
/word\s*ab/i
不区分大小写。
function envisio($content, $first, $second, $nowraps = array()) {
$lookahead = '';
$lookbehind = '';
if(count($nowraps) > 0) {
$lookahead = sprintf('(?![%s])', implode('', $nowraps));
$lookbehind = sprintf('(?<![%s])', implode('', $nowraps));
}
$regex = sprintf('/%s%s\s?%s%s/i', $lookbehind, $first, $second, $lookahead);
$replacement = sprintf('<span class="word">Word</span><span class="abb">AB</span>', $first, $second);
return preg_replace($regex, $replacement, $content);
}
$str = '"WordAB" (WORDAB, WORD AB, WordAB, Word AB etc.) http://example.com/wordab/?a=wordab&b=WORDAB';
echo envisio($str, 'word', 'ab', array('\/', '\&', '?', '='));
答案 1 :(得分:0)
试试这个:
function envisio($content){
$env = '~\s+(?:WORD|[Ww]ord)\s?(?:AB|[aA]b)\s+/';
$new = preg_replace($env, ' <span class="word">Word</span><span'
.' class="abb">AB</span> ', $content);
return $new;
}
您的错误可能来自空格部分。 () )(\s)+
至少需要2个空格。)
您也可以尝试更一般的模式:
$env = '~\s*\bword\s*ab\b\s*~i';
答案 2 :(得分:0)
您的原始代码:
$pattern = '/(\s)+( (WORD|word|Word)(\s)?(AB|ab|Ab) )(\s)+/';
$replacement = '<span class="word">Word</span><span class="abb">AB</span>';
$new = preg_replace ($pattern, $replacement, $content);
其中$content
是相关段落。我认为你要找的是一个“单词”,然后是一个“代码”(可以在一起运行,可以在不同的行上,可以是任何情况),并用固定的文本替换它们?使用\s+(
,您需要一个或多个空格,然后是常规空格(空白)......这就是您想要的吗?假设您要匹配的单词和代码被固定文本替换(在<span>
s中),例如
$pattern = '/\bword\s?ab\b/si`;
$replacement = (as before)
$new = (as before)
可能会这样做。 / s标志应跨越换行符,并且/ i标志与大小写无关。 \ s?允许术语之间有0或1个空格 - 如果可能有0个或更多个空格,您可能希望用\ s *替换它。我不确定我是否在这里适当地使用\ b,但目的是隔离一个单词短语,而不必明确指出在你想要的之前或之后可以或不可能出现的内容。