PHP中的正则表达式和preg_replace

时间:2013-06-17 03:04:19

标签: php regex preg-replace

我正在使用preg_replace(),我需要一些帮助。我一直试图这样做一段时间,现在是时候面对事实:我对正则表达式真的很糟糕。我甚至不确定他们能做什么,不能做什么。

假设我想将字符串dogs更改为cats,无论它们之间有多少空格。我该怎么做?

dogs -> cats
d o g s -> c a t s

我试过了:

preg_replace("/D\s*O\s*+G/", "cat", $string);

并且字符串返回时所有“d o g”保持不变。

下一个问题:是否可以忽略字母之间的字符而不仅仅是空格?

d.o g.s -> c.a t.s
dkgoijgkjhfkjhs -> ckgaijtkjhfkjhs

最后,当涉及到整个单词时,我似乎永远无法使该功能发挥作用。

display: none -> somestring
display    :    none -> somestring

我经常会让$string返回空。

提前致谢。

3 个答案:

答案 0 :(得分:2)

一个问题是,您不允许它将dD识别为同一件事。要做到这一点,只需将i放在最后/之后作为修饰符。

您的\s可以是您想要允许的任何内容 - 在这种情况下,您可能希望.允许所有字符(换行符除外,但添加了s修饰符除外)。

所以尝试这样的事情:

$string = preg_replace("/d(.*?)o(.*?)g/i","c$1a$2t",$string);

请注意,这意味着DOG变为cat。如果你想保留案件,试试这个:

$string = preg_replace_callback("/(d)(.*?)(o)(.*?)(g)/i",function($m) {
    return
        ($m[1] == "d" ? "c" : "C")
        .$m[2]
        .($m[3] == "o" ? "a" : "A")
        .$m[4]
        .($m[5] == "g" ? "t" : "T");
},$string);

答案 1 :(得分:0)

正则表达式区分大小写

你必须使用

preg_replace("/[Dd]\s*[Oo]\s*+[Gg]/", "cat", $string);

或使用case insensitve修饰符

preg_replace("/D\s*O\s*+G/i", "cat", $string);

如果你想与其他字符匹配,那么你需要将你的引用更改为与允许的字符匹配的内容,例如:

preg_replace("/D\W*O\W*+G/i", "cat", $string);

答案 2 :(得分:0)

请尝试忽略所有字符:

$res = preg_replace('~d([^do]*+)o([^g]*+)g([^s]*+)s~i' , 'c$1a$2t$3s', $string);