如果符合某些条件,我正在尝试让我的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
答案 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文件中定义两个类editLink
和viewLink
。
答案 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
,请参阅此示例。
答案 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 强>