Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php bbcode的正则表达式似乎在长句上失败了_Php_Regex - Fatal编程技术网

Php bbcode的正则表达式似乎在长句上失败了

Php bbcode的正则表达式似乎在长句上失败了,php,regex,Php,Regex,我需要一些帮助来替换我的BBCode。现在,我正在执行以下操作以查找和替换bbcode: $bbMatch[0] = '/(\[b\])(.*)(\[\/b\])/'; $bbReplace[0] = '<strong>${2}</strong>'; $bbMatch[1] = '/(\[url\])(.*)(\[\/url\])/'; $bbReplace[1] = '[url=${2}]${2}[/url]'; $b

我需要一些帮助来替换我的BBCode。现在,我正在执行以下操作以查找和替换bbcode:

    $bbMatch[0] =   '/(\[b\])(.*)(\[\/b\])/';
    $bbReplace[0] = '<strong>${2}</strong>';

    $bbMatch[1] =   '/(\[url\])(.*)(\[\/url\])/';
    $bbReplace[1] = '[url=${2}]${2}[/url]';

    $bbMatch[2] =   '/(\[url=)(.+)(\])(.+)(\[\/url\])/';
    $bbReplace[2] = '<a href="${2}" target="_blank">${4}</a>';

    $bbMatch[3] =   '/(\[s\])(.*)(\[\/s\])/';
    $bbReplace[3] = '<span style="text-decoration: line-through;">${2}</span>';

    $bbMatch[4] =   '/(\[u\])(.*)(\[\/u\])/';
    $bbReplace[4] = '<span style="text-decoration: underline;">${2}</span>';

    $bbMatch[5] =   '/(\[i\])(.*)(\[\/i\])/';
    $bbReplace[5] = '<em>${2}</em>';
    // Remove bad characters
    $text = htmlspecialchars($text);

    // Parse Smilies
    $text = preg_replace($bbMatch, $bbReplace, $text);
$bbMatch[0]='/(\[b\])(.*)(\[\/b\])/;
$bbReplace[0]='${2}';
$bbMatch[1]='/(\[url\])(.*)(\[\/url\])/';
$bbReplace[1]='[url=${2}]${2}[/url]';
$bbMatch[2]='/(\[url=)(.+)(\])(.+)(\[\/url\])/';
$bbReplace[2]='';
$bbMatch[3]='/(\[s\])(.*)(\[\/s\])/';
$bbReplace[3]='${2}';
$bbMatch[4]='/(\[u\])(.*)(\[\/u\])/';
$bbReplace[4]='${2}';
$bbMatch[5]='/(\[i\])(.*)(\[\/i\])/';
$bbReplace[5]='${2}';
//删除坏字符
$text=htmlspecialchars($text);
//解析笑脸
$text=preg_replace($bbMatch,$bbReplace,$text);
这里的问题是,当一个大的句子在这里运行时,它找不到结束标记。这将表明这是一个例子:

“一些斜体文本[/i]和此处的一些单词[i]也是斜体文本


如您所见,它显示了第一个的结束标记和第二个的开始标记。我该如何解决这个问题?

您的问题是默认情况下正则表达式是贪婪的。因此它将抓取第一个
[i]
和最后一个
[/i]之间的所有内容
。既然你告诉它在这些字符集之间抓取通配符,并且它试图抓取尽可能多的通配符,它就会很乐意抓取
[/i]和[i]
,只要周围有
[i]..[/i]
。你只需要在
*
之后添加一个
,使它不贪婪

$bbMatch[5] =   '/(\[i\])(.*?)(\[\/i\])/';
$bbReplace[5] = '<em>${2}</em>';
$bbMatch[5]='/(\[i\])(.*)(\[\/i\])/;
$bbReplace[5]='${2}';
顺便说一句,你会想改变你所有的正则表达式,而不仅仅是你的斜体


下面是贪婪与非贪婪正则表达式的一个例子:

这似乎解决了我的大多数问题。接下来,我注意到当结束标记与开始标记不在同一行时,整个bbcode不匹配。知道如何解决吗?@Dave:放下你的正则表达式,改为签出。@Dave在你所有的结束
/
l之后添加一个
m
ike:
“/(\[i\])(.*)(\[\/i\]))/m'
。这使得正则表达式是多行的。@Dave,hakre所说的也是有效的。你不能单独用正则表达式解析BB代码,因为BB代码不是一种常规语言。@Dave Siegel:除了编写PHP的PECL扩展外,还有其他方法。还有一篇很好的文章解释了为什么正则表达式不起作用/或者什么不起作用,并列出了alternaBBCODE及更多信息的示例: