preg_replace 即使找到匹配也只替换一次
preg_replace replace only once even if the match is found
我的 HTML 表单代码使用代码
将一些单词替换为 <-#word#->
$string = preg_replace("/($p)/i", '<-##->', $string);
问题是,如果表单有一些错误,每次重新提交表单时,单词都会变成 <-#<-#<-#word#->#->#->。是否可以更换,但如果已经更换,则不要更换。
这是我尝试使用 NOT 运算符的方法,但它不起作用
$string = preg_replace("/^(<-#)($p)^(#->)/i", '<-##->', $string);
另一种方法可能是检查 preg_match_all()
以确保您的匹配项是否 returning:
$string = '<-#<-#<-#Any alphanumeric input that user may wish#->#->#->';
preg_match_all("/(<-#)+([A-Za-z0-9_\s]+)(#->)+/s", $string, $matches);
$string = '<-#' . $matches[2][0] . '#->';
var_dump($string);
输出:
string(47) "<-#Any alphanumeric input that user may wish#->"
var_dump($matches);
会 return:
array(4) {
[0]=>
array(1) {
[0]=>
string(59) "<-#<-#<-#Any alphanumeric input that user may wish#->#->#->"
}
[1]=>
array(1) {
[0]=>
string(3) "<-#"
}
[2]=>
array(1) {
[0]=>
string(41) "Any alphanumeric input that user may wish"
}
[3]=>
array(1) {
[0]=>
string(3) "#->"
}
}
您可以使用负数 lookarounds 来断言直接在左侧和右侧的不是 <-#
和
(?<!<-#)(word)(?!#->)
您的代码可能如下所示:
$string = preg_replace("/(?<!<-#)($p)(?!#->)/i", '<-##->', $string);
我的 HTML 表单代码使用代码
将一些单词替换为 <-#word#->$string = preg_replace("/($p)/i", '<-##->', $string);
问题是,如果表单有一些错误,每次重新提交表单时,单词都会变成 <-#<-#<-#word#->#->#->。是否可以更换,但如果已经更换,则不要更换。 这是我尝试使用 NOT 运算符的方法,但它不起作用
$string = preg_replace("/^(<-#)($p)^(#->)/i", '<-##->', $string);
另一种方法可能是检查 preg_match_all()
以确保您的匹配项是否 returning:
$string = '<-#<-#<-#Any alphanumeric input that user may wish#->#->#->';
preg_match_all("/(<-#)+([A-Za-z0-9_\s]+)(#->)+/s", $string, $matches);
$string = '<-#' . $matches[2][0] . '#->';
var_dump($string);
输出:
string(47) "<-#Any alphanumeric input that user may wish#->"
var_dump($matches);
会 return:
array(4) {
[0]=>
array(1) {
[0]=>
string(59) "<-#<-#<-#Any alphanumeric input that user may wish#->#->#->"
}
[1]=>
array(1) {
[0]=>
string(3) "<-#"
}
[2]=>
array(1) {
[0]=>
string(41) "Any alphanumeric input that user may wish"
}
[3]=>
array(1) {
[0]=>
string(3) "#->"
}
}
您可以使用负数 lookarounds 来断言直接在左侧和右侧的不是 <-#
和
(?<!<-#)(word)(?!#->)
您的代码可能如下所示:
$string = preg_replace("/(?<!<-#)($p)(?!#->)/i", '<-##->', $string);