正则表达式,用于将标签转换为BBCode

时间:2019-05-22 21:41:59

标签: php regex regex-lookarounds regex-greedy bbcode

我有一个采用HTML的表格,将其转换为BBCode并将其存储在数据库中。

大多数标签重命名都可以通过一个简单的开关轻松完成,但是,文本对齐给我带来了一些麻烦。

HTML是<div style="text-align: right;"></div>,我需要转换为BBcode [正确] [/正确]

因此,我可以轻松地在开始标记上执行str_replace,但对于替换的结束标记,则可以是[/ left],[/ center]或[/ right]。在设置它之前,我需要知道开始标签是什么,因此出现了问题。

我对简单的正则表达式不好,所以这一难度更大。

从逻辑上讲,我正在尝试这样做:

$str = str_replace("</div>","$align_value",$str);

但是我需要知道什么是开始标签才能设置正确的结束标签。

预期结果是它将检查开始标记是什么

if($opening_tag = '<div style="text-align: right;">')
{
 $closing_tag = '[/right]';
} else if($opening_tag = '<div style="text-align: center;">')
{
 $closing_tag = '[/center]';
} else if($opening_tag = '<div style="text-align: left;">')
{
 $closing_tag = '[/left]';
} else {
  // Some other div that isn't aligned so do nothing
}

但是他们的关键是能够首先找到开始标签。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

用正则表达式解决此问题可能不是最好的主意。但是,如果您愿意,我们想获取属性值,我猜它总是在左,右和中心,然后收集我们的元素textContents,将其存储在两个捕获组中,然后添加我们想要的标签,也许类似于:

<.+?:\s+([a-z]+);">(.+?)<\/div>

如果需要,我们还可以使用更宽泛的表达式来更改div结束标记:

<.+?:\s+([a-z]+);">(.+?)<\/.+?>

enter image description here

演示

const regex = /<.+?:\s+([a-z]+);">(.+?)<\/div>/gm;
const str = `<div style="text-align: right;">Anything you wish here</div>
<div style="text-align: center;">Anything you wish here</div>
<div style="text-align: left;">Anything you wish here</div>
<div style="text-align: center;">Anything you wish here</div><div style="text-align: right;">Anything you wish here</div>`;
const subst = `[$1]$2[/$1]`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

DEMO

PHP

$re = '/<.+?:\s+([a-z]+);">(.+?)<\/.+?>/m';
$str = '<div style="text-align: right;">Anything you wish here</div>
<div style="text-align: center;">Anything you wish here</div>
<div style="text-align: left;">Anything you wish here</div>
<div style="text-align: center;">Anything you wish here</div><div style="text-align: right;">Anything you wish here</div>';
$subst = '[$1]$2[/$1]';

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

echo $result;

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

RegEx电路

jex.im可视化正则表达式:

enter image description here


根据Niet the Dark Absol在评论中的建议,此方法不适用于嵌套标签。