【问题标题】:Identify and replace pairs of shortcoded variables within a string in PHP using preg_replace使用 preg_replace 在 PHP 中识别和替换字符串中的短编码变量对
【发布时间】:2020-08-01 17:22:01
【问题描述】:

在有人问之前,我已经花了一个小时试图找到关于 SO 的解决方案,但似乎没有什么能完全达到我想要的......如果它在那里,我道歉!

所以...我正在尝试在一堆文本上运行 preg_replace 来替换成对的短代码。

示例文本:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.

我想把每张图片和标题放在一起并替换它们:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
<img src="Abc123.jpg" alt="This is an image" />
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
<img src="321cbA.jpg" alt="This is also an image" />
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.

我需要的代码如下:

$text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.";

$pattern = '/\[(img)\](.*?)\[\/\1\]?/';
// This doesn't work: $pattern = '/\[(img)\](.*?)\[\/\1\]\[(cap)\](.*?)\[\/\4\]?/';

$replacement = '<img src="$2.jpg" alt="Help" />';
// "Help" will be $5 when we get both values

echo preg_replace($pattern, $replacement, $text);

此代码获取一个值,但我无法在我的一生中获得获取这两个值的模式(上面的注释行是我所拥有的)。我已经尝试了几十个 SO 页面和其他网站,但似乎没有任何效果。毫无疑问,修正后的模式会很简单,但如果有人能让我摆脱痛苦,我将不胜感激!

感谢您的宝贵时间。

【问题讨论】:

    标签: php regex preg-replace shortcode


    【解决方案1】:

    我已经像这样修改了你的代码:

    $text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
    [img]Abc123[/img][cap]This is an image[/cap]
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
    [img]321cbA[/img][cap]This is also an image[/cap]
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.";
    
    $pattern = '/\[img\](\w+)\[\/img\]\[cap\]([\w\s]+)\[\/cap\]/';
    // This doesn't work: $pattern = '/\[(img)\](.*?)\[\/\1\]\[(cap)\](.*?)\[\/\4\]?/';
    
    $replacement = '<img src="$1.jpg" alt="$2" />';
    // "Help" will be $5 when we get both values
    
    echo preg_replace($pattern, $replacement, $text);
    

    我只更改了模式和替换字符串。

    【讨论】:

      【解决方案2】:
      $str = <<<'EOD'
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
      [img]Abc123[/img][cap]This is an image[/cap]
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
      [img]321cbA[/img][cap]This is also an image[/cap]
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
      EOD;
      
      $trans = ['[img]' => '<img src="', '[/img][cap]' => '" alt="', '[/cap]' => '" />'];
      
      echo strtr($str, $trans);
      

      demo

      您代码中的最后一个引用应该是\3 而不是\4(但您真的需要捕获标签名称吗?)。

      【讨论】:

      • 当您说标签名称时,您指的是图像标题吗?如果是这样,那么是的,我认为它们是必要的。页面上会有多个图像,我想给每个图像一个特定的标签。还要感谢您的解决方案,另一个解决方案只需要对我的代码稍作调整,所以我现在会使用它,但这个也可以,所以我会保留它!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2015-06-07
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      相关资源
      最近更新 更多