preg_replace仅替换一次,即使找到匹配项

时间:2019-04-22 03:53:12

标签: php preg-replace

我的HTML表单代码使用代码用<-#word#->替换了一些单词

$string = preg_replace("/($p)/i", '<-#$1#->', $string);

问题在于,如果表单存在某些错误,则在重新提交表单时,每次有人重新提交表单时,单词将变为<-#<-#<-#word#->#->#->。是否可以更换,但是如果已经更换则不要。 这是我尝试使用NOT运算符尝试的方法,但是它不起作用

$string = preg_replace("/^(<-#)($p)^(#->)/i", '<-#$1#->', $string);

2 个答案:

答案 0 :(得分:0)

另一种方法可能是检查preg_match_all()以确保您的匹配项是否返回:

$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);将返回:

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) "#->"
  }
}

答案 1 :(得分:0)

您可以使用否定的lookarounds来断言直接位于左侧的内容,而不是右侧的<-#

(?<!<-#)(word)(?!#->)

Regex demo | Php demo

您的代码可能如下:

$string = preg_replace("/(?<!<-#)($p)(?!#->)/i", '<-#$1#->', $string);