preg_replace没有捕捉模式

时间:2014-01-13 16:22:06

标签: php regex preg-replace

尝试接受大段落字符串并格式化关键字。我的代码如下:

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字符串。但是,该功能没有发现任何事件。我的正则表达式中缺少这个错误吗?

3 个答案:

答案 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,但目的是隔离一个单词短语,而不必明确指出在你想要的之前或之后可以或不可能出现的内容。