gpt4 book ai didi

php - 如何在 RE 中匹配这个特定的字符串?

转载 作者:行者123 更新时间:2023-12-02 22:34:23 25 4
gpt4 key购买 nike

我又一次被正则表达式困住了。没有任何好的资料可以学习更高级的用法。

我正在尝试匹配 [image width="740"height="249"parameters=""]51lca7dn56.jpg[/image] $cache->image_tag("$4", $1, $2, "$3").

如果所有 [image] 参数都存在,一切都会很好,但我需要它匹配,即使缺少某些东西。例如 [image width="740"]51lca7dn56.jpg[/image]

当前代码是:

$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\" parameters=\"(.*?)\"\](.*?)\[/image\]#e', '$cache->image_tag("$4", $1, $2, "$3")', $text);

正则表达式是唯一总是让我卡住的东西,所以如果有人也可以推荐一些好的资源,这样我就可以自己处理这些类型的问题,我将不胜感激。

我的虚拟版本是这样的:

// match only [image]
$text = preg_replace('#\[image\](.*?)\[/image\]#si', '$cache->image_tag("$1", 0, 0, "")', $text);
// match only width
$text = preg_replace('#\[image width=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$2", $1, 0, "")', $text);
// match only width and height
$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$3", $1, $2, "")', $text);
// match only all
$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\" parameters=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$4", $1, $2, $3)', $text);

(这段代码实际上并没有像预期的那样工作,但你会更好地理解我的观点。)我希望基本上把所有这些可怕的困惑都放在一个 RE 调用中。

根据 Ωmega 的回答测试并运行的最终代码:

// Match: [image width="740" height="249" parameters="bw"]51lca7dn56.jpg[/image]
$text = preg_replace('#\[image\b(?=(?:[^\]]*\bwidth="(\d+)"|))(?=(?:[^\]]*\bheight="(\d+)"|))(?=(?:[^\]]*\bparameters="([^"]+)"|))[^\]]*\]([^\[]*)\[\/image\]#si', '$cache->image_tag("$4", $1, $2, "$3")', $text); // the end is #si, so it would be eaiser to debug, in reality its #e

但是,如果宽度或高度可能不存在,它将返回空而不是 NULL。所以我采纳了 preg_replace_callback() 的想法:

$text = preg_replace_callback('#\[image\b(?=(?:[^\]]*\bwidth="(\d+)"|))(?=(?:[^\]]*\bheight="(\d+)"|))(?=(?:[^\]]*\bparameters="([^"]+)"|))[^\]]*\]([^\[]*)\[\/image\]#', create_function(
'$matches',
'global $cache; return $cache->image_tag($matches[4], ($matches[1] ? $matches[1] : 0), ($matches[2] ? $matches[2] : 0), $matches[3]);'), $text);

最佳答案

也许可以试试像这样的正则表达式,它会尝试在图像标签(如果有的话)中获取额外的参数。这样,参数可以按任何顺序排列,包括和省略参数的任意组合:

$string = 'this is some code and it has bbcode in it like [image width="740" height="249" parameters=""]51lca7dn56.jpg[/image] for example.';

if (preg_match('/\[image([^\]]*)\](.*?)\[\/image\]/i', $string, $match)) {
var_dump($match);
}

结果匹配:

array(3) {
[0]=>
string(68) "[image width="740" height="249" parameters=""]51lca7dn56.jpg[/image]"
[1]=>
string(39) " width="740" height="249" parameters="""
[2]=>
string(14) "51lca7dn56.jpg"
}

因此您可以检查 $match[1] 并解析出参数。您可能需要使用 preg_replace_callback在回调中实现逻辑。

希望对您有所帮助。

关于php - 如何在 RE 中匹配这个特定的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com