Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的正则表达式和preg_替换_Php_Regex_Preg Replace - Fatal编程技术网

PHP中的正则表达式和preg_替换

PHP中的正则表达式和preg_替换,php,regex,preg-replace,Php,Regex,Preg Replace,我正在使用preg\u replace(),我需要一些帮助。我已经尝试这么做了一段时间了,现在是时候面对事实了:我对正则表达式非常不熟悉。我甚至不确定用它们能做什么,不能做什么 假设我想将字符串dogs更改为cats,无论它们之间有多少空格。我该怎么做 dogs -> cats d o g s -> c a t s 我试过: preg_replace("/D\s*O\s*+G/", "cat", $string); 字符串返回时所有的“dog”都保持不变 下一个问题:是否可以忽略

我正在使用
preg\u replace()
,我需要一些帮助。我已经尝试这么做了一段时间了,现在是时候面对事实了:我对正则表达式非常不熟悉。我甚至不确定用它们能做什么,不能做什么

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

dogs -> cats
d o g s -> c a t s
我试过:

preg_replace("/D\s*O\s*+G/", "cat", $string);
字符串返回时所有的“dog”都保持不变

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

d.o g.s -> c.a t.s
dkgoijgkjhfkjhs -> ckgaijtkjhfkjhs
最后,当涉及到整个单词时,我似乎也无法让函数发挥作用

display: none -> somestring
display    :    none -> somestring
通常情况下,我只是让
$string
返回空值


提前感谢。

正则表达式区分大小写

你必须使用

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);

一个问题是,您不允许它将
d
d
识别为同一事物。为此,只需将
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);

尝试此操作以忽略所有字符:

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

你到底想在这里实现什么?区分大小写(在最后的“/”后面添加一个“i”标志以使其不敏感)。然而,通常更有效的方法是将字符串的大小写作为检查对象,而不是同时检查两者(除非有必要)。除了更好地掌握正则表达式之外,我只想更好地控制我网站上的帖子,这样就不会有人写文章,从而有效地避免审查。这里的帖子非常有用。