【问题标题】:Regex replace match with match + addons正则表达式用匹配+插件替换匹配
【发布时间】:2011-08-04 09:16:00
【问题描述】:

我想替换不区分大小写的,比如说 mix:

text StmiXx and some more mIxx text

正则表达式替换后:

text St<font color="red">miX</font>x and some more <font color="red>mIx</font> text

代码:

$string = "text StmiXx and some more mIxx text";
$pattern = "/mix/i";
$replacement = "<font color=\"red\">match</font>";
echo preg_replace($pattern, $replacement, $string);

如何使用正则表达式来做到这一点?我也想用 (Linux)sed 试试这个,或者还有 egrep、grep 的方法。

egrep 有一个选项 --color=always 但没有自定义突出显示。

【问题讨论】:

    标签: php regex sed grep


    【解决方案1】:

    你很接近!以下是您可以在 PHP 中执行此操作的方法:

    $string = "text StmiXx and some more mIxx text";
    $pattern = "/(mix)/i";
    $replacement = "<font color=\"red\">$1</font>";
    echo preg_replace($pattern, $replacement, $string);
    

    在模式中,括号可用于捕获内容(组)。然后您可以通过重复括号的数量来引用该组。在这种情况下,我们只有一组。这就是为什么在替换中我使用$1 来引用我们模式中唯一的捕获组。

    【讨论】:

    • 不客气。如果我的回答解决了您的问题,请随时点击我的回答左侧投票数下方的空勾图标接受它。
    【解决方案2】:
    s="text StmiXx and some more mIxx text"
    echo "$s" | sed -e 's!\([mM][iI][xX]\)!<font color="red">\1</font>!g'
    

    编辑:

    执行替换并仅打印匹配的行:

    sed -n -e 's!\([mM][iI][xX]\)!<font color="red">\1</font>!g;/[mM][iI][xX]/p'
    

    并且要仅获取前 N 行,您可以将其通过管道传输到 head 或 to:

    sed -n -e '1,10p'
    

    【讨论】:

    • 是否还有一个选项可以打印前 10 个匹配项。我看了 man sed,info sed,sed.sourceforge.net/sed1line.txt。对于反转匹配,我在 [^mM] 中添加 ^
    • 或者像 egrep 这样的前 n 个匹配项有 -m NUM 选项。
    • @broadand:如果要打印前 10 个匹配项,请在末尾添加 | head -n 10 ;-)。
    • 是的,但我得到 sed:无法将 157 个项目写入标准输出:管道损坏 sed:无法将 80 个项目写入标准输出:管道损坏
    • @broadand:不是管道到头部,而是管道到另一个 sed:sed -n -e '1,10p'。 Sed 会一直读到最后,避免 Broken Pipe。但是您有多少行输入,您在哪个 UNIX 上,您使用哪个 shell?使用 385 行,在 cygwin 和 bash 上,我没有得到 Broken Pipe。
    【解决方案3】:
    $string = "text StmiXx and some more mIxx text";
    $pattern = "/(mix)/i";
    $replacement = "<font color=\"red\">$1</font>";
    echo preg_replace($pattern, $replacement, $string);
    

    必须花一分钟才能真正弄清楚代码中是否有问题:)

    $1 表示模式在 () 中找到的第一件事

    例如,如果您出于某种原因想将其更改为 m-ix,您可以这样:

    $string = "text StmiXx and some more mIxx text";
    $pattern = "/(m)(ix)/i";
    $replacement = "<font color=\"red\">$1-$2</font>";
    echo preg_replace($pattern, $replacement, $string);
    

    【讨论】:

    • 谢谢罗宾,我希望正则表达式速度很快,因为我得到的 txt 文件平均大小约为 5 MB。
    猜你喜欢
    • 2012-05-16
    • 2013-12-06
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多