【问题标题】:Need help with REGEX in PHP. A simple one. Help!在 PHP 中需要 REGEX 的帮助。一个简单的。帮助!
【发布时间】:2010-11-12 07:02:59
【问题描述】:

最近,我正在玩一些与 phpBB3 中的 BBCode 相关的东西。当我回溯我的数据库、帖子表和随机帖子时。我发现图片标签是这样写的[img:fcjsgy5j]。每个帖子的 [img: ... ] 之间会生成 8 个随机字符。

[img:fcjsgy5j]http://imageurl.jpg[/img]

我的问题是,如何利用 preg_replace() 将随机字符替换成这种方式..

<img src="http://imageurl.jpg">

【问题讨论】:

标签: php regex


【解决方案1】:
$output = preg_replace("`\[img:.+?\](.*?)\[/img\]`i", '<img src="$1"/>', $input);
  • [ 开始一个字符集。我们不希望这样;我们想匹配文字 [ 字符,所以我们必须用 \ 转义它
  • . 匹配任意字符
  • + 表示我们匹配 1 个或多个之前的事物(任何字符)
  • ? 使前面的量词变得不贪心(.+ 将匹配所有内容,直到字符串的最后,这不是我们想要的,我们希望它尽可能少地匹配......直到下一个 @987654329 @
  • (.*?) 匹配 [img] 标记之间的所有垃圾。又贪心了。我们将() 放在它周围以使其匹配集
  • 开头和结尾的`(反引号)可以是任何字符...无论您以什么字符开头,都必须以任何字符结尾。很多人使用/,但我更喜欢反引号,因为它很少出现在正则表达式中的任何地方,因此我不需要转义它。
  • 最后的i 表示表达式将不区分大小写。 (将匹配 img、IMG、ImG 等)
  • 替换中的$1 指代我们之前表示的() 部分...它基本上采用那里匹配的任何内容,并将其放入$1 的位置

【讨论】:

  • [a-z] 会错过 5,最好使用简单的 .+
  • @generalhenry: .+? 你的意思是......否则它很贪婪,会吞噬一切。
  • 我一直认为你必须在 PHP 正则表达式中使用分隔符。这段代码真的运行了吗?我没有安装PHP,所以无法查看。
  • @Tim:我认为你是对的...我最近一直在写 C# 正则表达式,所以我忘记了;)
  • 感谢您的回答。我可以知道在哪里可以学习 php 的正则表达式吗?读了几遍还是没明白。
【解决方案2】:
$result = preg_replace('%\[img:[^]]+\]([^[]+)\[/img\]%', '<img src="\1">', $subject);

或者,作为注释的正则表达式:

$result = preg_replace(
    '%\[img:  # match [img:
    [^]]+     # match one or more non-] characters
    \]        # match ]
    ([^[]+)   # match one or more non-[ characters
    \[/img\]  # match [/img]
    %x', 
    '<img src="\1">', $subject);

【讨论】:

    【解决方案3】:

    试试这个代码:

    <?php
    $search = array(
        '\[img:.+?\](.*?)\[\/img\]\'
    );
    $replace = array(
        '<img src="\\2">'
    );
    $result = preg_replace($search, $replace, $string);
    }
    ?>
    

    我使用了 preg_replace 的数组形式,以便您将来可以添加更多搜索和替换模式。我认为您正在尝试替换一些 BBCODE 标签。网上有很多库可以正确处理 BBCODE。

    编辑

    喜欢这个: http://php.net/manual/en/book.bbcode.php

    【讨论】:

    • 你的$search 永远不会匹配.. 你没有处理随机字符。还有,你回来了……从什么?这不在函数 AFAIK 中。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多