Php 如何在不考虑输入的情况下使用preg_replace?

Php 如何在不考虑输入的情况下使用preg_replace?,php,regex,Php,Regex,我有一个输入字段,用户可以在其中指定替换模式 但我想让他们留下空白,把它当作“模式可以是任何东西”。请记住字符串($subject)可以是空的,也可以不是空的 我尝试使用“.*”进行此操作,但它会写入双输出。我可以用什么来代替 空模式只是许多可能模式中的一种,所以我更喜欢使用正则表达式,尽管我可以只做if(empty($pattern))echo$替换 <?php echo '<ol>'; echo '<li><ol>'; $pattern

我有一个输入字段,用户可以在其中指定替换模式

但我想让他们留下空白,把它当作“模式可以是任何东西”。请记住字符串($subject)可以是空的,也可以不是空的

我尝试使用“.*”进行此操作,但它会写入双输出。我可以用什么来代替

空模式只是许多可能模式中的一种,所以我更喜欢使用正则表达式,尽管我可以只做
if(empty($pattern))echo$替换

<?php

echo '<ol>';
echo '<li><ol>';
    
$pattern = '';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '.*';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '.*';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '.+';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '.+';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '$^';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '$^';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '(?:)';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '(?:)';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '(?=a)o';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '(?=a)o';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '.\A';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '.\A';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '\z.';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '\z.';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

echo '</ol><li><ol>';

$pattern = '';
if (empty($pattern))
    $pattern = '(?!)';
$replacement = 'Sample output';
$subject = 'Foo bar';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

$pattern = '';
if (empty($pattern))
    $pattern = '(?!)';
$replacement = 'Sample output';
$subject = '';
echo '<li>' . preg_replace('/' . $pattern . '/', $replacement, $subject);

?>

所需的输出(对于空字符串和非空字符串)应为:

  • 样本输出
  • 样本输出
  • 正如您在下面看到的,输出从来不是这样的:


  • 采样输出采样输出采样输出采样输出采样输出采样输出采样输出采样输出采样输出采样输出输出采样输出采样输出采样输出采样输出采样输出采样输出采样输出输出输出输出输出输出输出采样输出输出输出输入输入输入输入输入输入输入输入输入输出采样输出采样输出采样输出采样输出采样输出采样输出输出输出输出输出输出输出输出输出采样输出采样输出采样输出输出输出输出输出输出输出输出输出输出输出输出输出采样输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出采样输出采样输出采样输出输出采样输出输出输出输出输出采样输出输出输出输出输出输出输出输出采样输出输出输出采样输出输出输出输出输出输出采样输出输出输出输出输出输出采样输出输出输出输出输出输出输出输出输出输出采样输出输出输出输出输出输出输出输出输出输出输出输出采样输出输出输出输出输出输出输出输出输出输出输出输出输出采样输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出输出字符串,并且
    *
    模式能够匹配空字符串,它首先匹配整个字符串,然后-这是PCRE特性-允许在字符串末尾进行下一次匹配。看

    在您的情况下,解决方案同时使用字符串开头(
    ^
    \A
    )和字符串结尾(
    $
    \z
    )锚定:


    这样,您将始终匹配一个字符串,不管它是否为空。

    替换将加倍,因为
    preg\u replace
    替换字符串中的所有匹配项,
    *
    模式能够匹配空字符串,并且它首先匹配整个字符串,然后-这是PCRE功能-允许在字符串末尾进行下一次匹配。看

    在您的情况下,解决方案同时使用字符串开头(
    ^
    \A
    )和字符串结尾(
    $
    \z
    )锚定:


    这样,您将始终匹配一个字符串,不管它是否为空。

    使用
    +
    代替。使用
    /$^/
    作为正则表达式,它将始终失败,并且如果模式为空,您将返回原始输入-只需返回替换,否?正如已经指出的,您需要使用任何永远不会匹配任何字符串的正则表达式,如
    (?=a)o
    $^
    \a
    \z.
    (?)
    ,等等。如果您需要匹配任何0个或更多字符,请使用
    '/\A.*\z/s'
    使用
    +
    。使用
    /$^/
    作为正则表达式,它将始终失败,并且如果模式为空,您将返回原始输入-只需返回替换,否?正如已经指出的,您需要使用任何不匹配任何字符串的正则表达式,如
    (?=a)o
    $^
    \a
    \z.
    (?)
    ,等等。如果您需要匹配任何0个或更多字符,请使用
    '/\A.*\z/s'
    ,非常感谢!但是为什么它们会从您和我身上删除点?另外,是什么让您想到了\A和\z,而不仅仅是标准的^和$?@LWC
    \A
    在上述情况下与
    ^
    相同,
    $
    也将作为
    \z
    ,因为
    *
    是贪婪的,并且匹配任何字符。只是
    \A
    \z
    的意思总是一样的,字符串的开头和结尾都是相应的。我喜欢单语义模式,它们的行为不能被重新定义。
    $
    不等于
    \z
    ,即使不使用
    m
    标志,但这这是不相关的,所以两个都会起作用。请考虑做同样的问题。但是就像你问的,为什么人们会投票否决一个被接受的答案?这个答案真的帮助了我,所以因为这个疯狂而删除这个问题将是一个耻辱。让你想到\A和\z,而不仅仅是标准的^和$?@LWC
    \A
    在上面的例子中与
    ^
    相同,
    $
    也将作为
    \z
    ,因为
    *
    是贪婪的,并且匹配任何字符。只是
    \A
    \z
    总是意味着相同,字符串的开头和结尾我喜欢单义模式,他们的行为不能被重新定义。<代码> $不等于<代码> \z < />代码,即使在不使用代码> M< /Case> FLAG,但是这不相关,所以两者都会起作用。投票表决,请考虑做同样的问题。但是就像你问的,为什么人们会否决接受的ANSWE?这个答案真的帮了我的忙,所以如果因为这种疯狂而删除这个问题,那将是一种耻辱。
    '/\A.*\z/s'
    '/^.*$/s'