1

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

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

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

我努力了:

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

并且字符串返回所有“do g”不变。

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

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

最后,当涉及到整个单词时,我似乎也永远无法使该功能正常工作。

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

很多时候我只是导致$string返回空。

提前致谢。

4

3 回答 3

3

一个问题是你不允许它识别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);
于 2013-06-17T03:09:09.927 回答
0

正则表达式区分大小写

你将不得不使用

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

或使用不区分大小写的修饰符

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

如果您想与其他字符匹配,则只需将您的 \s 引用更改为与允许的字符匹配的内容,例如:

preg_replace("/D\W*O\W*+G/i", "cat", $string);
于 2013-06-17T03:06:51.550 回答
0

试试这个忽略所有字符:

$res = preg_replace('~d([^do]*+)o([^g]*+)g([^s]*+)s~i' , 'c$1a$2t$3s', $string);
于 2013-06-17T03:11:55.997 回答