我有一个采用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
}
但是他们的关键是能够首先找到开始标签。任何帮助表示赞赏
答案 0 :(得分:0)
用正则表达式解决此问题可能不是最好的主意。但是,如果您愿意,我们想获取属性值,我猜它总是在左,右和中心,然后收集我们的元素textContents,将其存储在两个捕获组中,然后添加我们想要的标签,也许类似于:
<.+?:\s+([a-z]+);">(.+?)<\/div>
如果需要,我们还可以使用更宽泛的表达式来更改div
结束标记:
<.+?:\s+([a-z]+);">(.+?)<\/.+?>
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);
$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;
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im可视化正则表达式:
根据Niet the Dark Absol在评论中的建议,此方法不适用于嵌套标签。