用不同的替换替换正则表达式相同模式的出现

时间:2017-01-22 16:57:36

标签: php regex

为了避免SQL注入,就像我们所有人一样,我清理所有用户提供的字符串。现在我想给用户提供保存格式化文本的可能性,我想这样做的方式是复制Stack / WhatsApp方法:

  • *word* - > 粗体
  • _word_ - > 斜体

在将文本上传到数据库之前,我会检查这个字符,如果匹配,我会替换

  • *word* - &gt; <b>word</b>
  • _word_ - &gt; <i>word</i>

问题是,我确信有一种方法,使用正则表达式来表示:如果您符合此标准(即*word*),请替换:

  • 带有开放标记*第一次出现<b>
  • 带有关闭代码*第二次出现</b>

代码有效,非工作部分是foreach ()内第二个if ()循环中的部分。我最后一次绝望的尝试就是这样,但实际上,即使是像我这样的非正则派专家也没有任何意义。我试图将正则表达式划分为三个不同的部分,在preg_replace中使用$1$3进行回忆。

    function textFormatting($text) {
    $text = preg_replace('/[ \t]+/', ' ', $text); //transform any 2+ space in 1 space
    $text = nl2br($text);
    //$text = preg_replace('/[\n]+/', '<br>', $text);
    $text = explode(' ', $text);
    $regexAY =
        [
            '/([*]{1})([a-zA-Z0-9]+)([*]{1})/' =>
                [
                    "pattern" => "*",
                    "openTag" => "<b>",
                    "closeTag" => "</b>"
                ],
            '/([_]{1})([a-zA-Z0-9]+)([_]{1})/' =>
                [
                    "pattern" => "_",
                    "openTag" => "<i>",
                    "closeTag" => "</i>"
                ]
        ];

    $newText = [];
    foreach ($text as $key => $word) {
        foreach ($regexAY as $regex => $value) {
            if (preg_match($regex, $word)) {
                //$word = preg_replace($regexAY[$regex]["pattern"], $regexAY[$regex]["replacement"], $word);
                $word = preg_replace('/$1/', $regexAY[$regex]["openTag"], $word);
                $word = preg_replace('/$3/', $regexAY[$regex]["closeTag"], $word);
            }
        }
        if ($word !== '') { array_push($newText, $word); }
    }

    return implode(' ', $newText);
    }

    $text = "     Hi _this_ _text_ _is a test_
       *for*        
       text     _formatting_     
       so       don't pay   *attention*
      d";
    echo $text;
    echo "\n -------- \n";
    $text = textFormatting($text);
    echo $text;

1 个答案:

答案 0 :(得分:2)

我会将preg_replace方法与\*(.*?)\*一起用作模式:

$text = "This is a *word* and here are *more*. That is the case *with this too*.";

$output = preg_replace("/\*(.*?)\*/", "<b>$1</b>", $text);
echo $output;

返回:

This is a <b>word</b> and here are <b>more</b>. That is the case <b>with this too</b>.

如果您想使用正则表达式或添加更多示例,请查看此处。 https://regex101.com/r/aH6xr8/2