[英]PHP Regex ignore string between specific characters
我使用正则表达式向我的网站添加标记,并且我希望 **string** 仅在字符串和星号不在四个括号之间时才使字符串变为粗体,如下所示: [[**string**]] 在这种情况下四个星号和字符串应该保持不变并且不会消失或变为粗体。 我希望这可以通过正则表达式实现。
为了检测字符串何时在四个星号之间,我使用这个正则表达式 /**(.+?)**/ 并且为了检测字符串何时在四个括号之间,我使用 /[[(.+?)]]/s
你可能会使用
(?<!\[\[|\*)\*\*(?!\*)(.+?)(?<!\*)\*\*(?!\*|]])
模式匹配
(?<!\[\[|\*)
负向后视,向左断言[[
或*
\*\*(?!\*)
匹配**
和否定 lokoahead 以断言不*
向右(.+?)
捕获组 1 ,尽可能少匹配 1+ 个字符(?<!\*)\*\*
负向后视,向左断言 not *
并匹配**
(?!\*|]])
负前瞻,断言不是*
或]]
到右边另一种选择可能是匹配所有你不想要的,然后使用 SKIP FAIL
(?:\[\[.*?]]|\*{3,}.*?\*+|\*+.*?\*{3,})(*SKIP)(*F)|\*\*(.+?)\*\*
在没有看到您的输入字符串中有多少可变性的情况下,我想说您可以简单地匹配并丢弃双方括号和双星号包装的子字符串,然后匹配并捕获仅用星号包装的非大括号包装的子字符串。
有一些边缘情况(比如嵌套的方括号子字符串)会失败,但我不知道它们是否有可能发生。
代码:(演示)
$text = <<<TEXT
Text **bold** [[**not
bold**]]
TEXT;
echo preg_replace(
'~\[{2}\*{2}.*?\*{2}]{2}(*SKIP)(*FAIL)|\*{2}(.*?)\*{2}~s',
'<b>$1</b>',
$text
);
Output:
Text <b>bold</b> [[**not
bold**]]
您需要的 id 仅匹配**string**
而不是[
并且应该这样:
(?<!\[)
否定后视以确保字符串前面没有[
(?:[\*]{2})
字符串必须以两个**
开头([^\[\]\*]+)
字符串匹配(?:[\*]{2})
字符串必须以两个**
结尾(?<?\[)(:?[\*]{2})([^\[\]\*]+)(::[\*]{2})
PHP 代码:
<?php
$str="[[**string**]]**string**[[**string**]]**string****string****string** [[**string**]]**string**[[**string**]]**string****string****string**[[**string**]]**string**[[**string**]]**string**[[**string**]][[**string**]]**string****string****string****string**abcd*abcdefg*abcdefgh**abcd***[**string**]]";
$pattern = '/(?<!\[)(?:[\*]{2})([^\[\]\*]+)(?:[\*]{2})/';
$replacement = '<b>$1</b>';
$str= preg_replace($pattern, $replacement,$str);
print $str;
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.