RegEx将文本转换为链接会遇到麻烦

时间:2015-06-29 15:50:24

标签: php regex

如果符合某些条件,我正在尝试让我的shoutbox自动将发布的数据转换为链接。它可以工作,除非在一个shoutbox帖子中有多个链接。

这是我的代码,用于转换它:

<?
            $text = "edit:4961310112967 - edit:021331612649 Are these correct?";
            echo $text."<br><br>";
            $view = "/(view|edit)\:[0-9]+(\S)?/";
            if(preg_match_all($view, $text, $url, PREG_SET_ORDER)) {

                    foreach ($url as $val) {
                        echo "(matched: " . $val[0] . ")\n";
                        $checkCode = explode(":", $val[0]);
                        if(strcmp($checkCode[0], 'view') == 0) {
                            $text = preg_replace($view, '<a target="_blank" style="text-decoration: underline;color:purple;font-weight:bold;" href="../index.php?UPC='.$checkCode[1].'">(View Product)</a>', $text);
                        } else if(strcmp($checkCode[0], 'edit') == 0) {
                            $text = preg_replace($view, '<a target="_blank" style="text-decoration: underline;color:purple;font-weight:bold;" href="../edit.php?UPC='.$checkCode[1].'">(Edit Product)</a>', $text);
                        }
                        echo "<br>".$text;
                        echo "<br>(".$checkCode[0]." - ".$checkCode[1].")<br><br>";

                    }

            }
            echo "<br><br>".$text."<br><br>"; ?>

正如您所看到的,顶部的$ text变量有两个位置,表示“编辑:” - 这就是调用正则表达式将其转换为链接的意思。有问题的链接例如是

<a href="edit.php?UPC=############"</a>

目前,如果对正则表达式进行多次调用,它基本上会使两个链接成为第一次编辑:

对不起,我不觉得我这样解释得很好。

此字符串:编辑:4961310112967 - 编辑:021331612649这些是正确的吗? 正则表达式将使两个链接edit.php?UPC = 4961310112967

4 个答案:

答案 0 :(得分:1)

避免多次解析字符串的方法:

$text = "edit:4961310112967 - edit:021331612649 Are these correct?";

$pattern = '~\b(edit|view):(\d+)~Si';

$links = [
    'edit' => ['className' => 'editLink', 'URL' => '../edit.php', 'txt' => '(Edit Product)'],
    'view' => ['className' => 'viewLink', 'URL' => '../index.php', 'txt' => '(view Product)']
];

$result = preg_replace_callback($pattern, function ($m) use ($links) {
    $action = strtolower($m[1]);
    return '<a class="' . $links[$action]['className']
         . '" href="' . $links[$action]['URL'] . '?UPC=' . $m[2]
         . '">' . $links[$action]['txt'] . '</a>';
}, $text);

您需要在css文件中定义两个类editLinkviewLink

答案 1 :(得分:0)

我可能会把它分成2个正则表达式来简化它。

https://regex101.com/r/bN9qY5/2

$re = "/edit\\:([0-9]+(\\S)?)/m"; 
$str = "edit:4961310112967 - edit:021331612649 Are these correct?\n\nedit:1231289389123\n\nedit:123123lkajsdad\n\nview:234234234234234"; 
$subst = "<a href=\"edit.php?UPC=$1\"</a>"; 

$result = preg_replace($re, $subst, $str);

然后对视图执行相同操作。 希望它有所帮助!

答案 2 :(得分:0)

您可能不希望使用preg_replace来生成字符串,我相信这主要是手头的问题。有关使用行为正确的sprintf,请参阅此示例。

http://ideone.com/FrfsEN

答案 3 :(得分:0)

您要关注此内容吗?

正则表达式(edit|view)\:([0-9]+)

$re = "/(edit|view)\\:([0-9]+)/m"; 
$str = "edit:4961310112967 - edit:021331612649 Are these correct?\n\nedit:1231289389123\n\nedit:123123lkajsdad\n\nview:234234234234234"; 
$subst = "<a href=\"$1.php?UPC=$2\">($1 Product)</a>"; 

$result = preg_replace($re, $subst, $str);

<强> Demo