编程语言
首页 > 编程语言> > PHP RegEx的乐趣(preg_replace)

PHP RegEx的乐趣(preg_replace)

作者:互联网

因此,我有一个表单元素正在提交给我构建的应用程序中的控制器/模型,我需要剥离不符合我的要求的所有HTML,并将其他HTML转换为该应用程序的专有标签,对此我感到疑惑是有人可以查看我的正则表达式preg_replace并查看可以进行哪些改进.

$postText = $_POST['post_text'];
//Regex Functions
$p1 = '~<span class=\"atwho-view-flag atwho-view-flag-#\" c>|<span c class \"atwho-view-flag atwho-view-flag-#\">|<span c class \"atwho-view-flag atwho-view-flag-@\">|<span contenteditable=\\"false\\" class=\\"atwho-view-flag atwho-view-flag-@\\">|<span contenteditable=\\"false\\" class=\\"atwho-view-flag atwho-view-flag-#\\">|</span>|<span>|<span c>|<span contenteditable=\\"false\\">|&nbsp;|&nbsp|<br>~';
$r1 = '';
$start = preg_replace($p1, $r1, $postText);
$clean = str_replace('_','',$start);
$users = preg_replace("~(<var data-type=\"user\" class=\"userHighlight\" id=\"(.*?)\">)(.*?)(</var>)~", "<_link>$2|$3</_link> ", $clean);
$tags = preg_replace("~(<var data-type=\"tag\" class=\"tagHighlight\" id=\"(.*?)\">)#(.*?)(</var>)~", "<_link>tag://$3|#$3</_link> ", $users);
$last = preg_replace("~(^|\\s)#(\\w*[a-zA-Z_]+\\w*)~", " <_link>tag://$2|#$2</_link> ", $tags);
$spaces = preg_replace("~(^&nbsp;|&nbsp)~", " ", $last);
$divs = preg_replace("~(?:</?div>)+~", "\r\n", $spaces);
$final = preg_replace("~(<br>)~", "\r\n", $divs);

我正在使用一个内容可编辑的div,该div使用at.js by ichord库来进行哈希标记和用户提及,我本质上想转换以下标记(如上所示)

发表内容:

<span contenteditable="false" class="atwho-view-flag atwho-view-flag-#"><var data-type="tag" class="tagHighlight" id="tag://4">#Hashtag</var><span contenteditable="false">&nbsp;<span></span></span></span>is <span contenteditable="false" class="atwho-view-flag atwho-view-flag-#"><var data-type="tag" class="tagHighlight" id="tag://2">#AnotherHashtag</var><span contenteditable="false">&nbsp;<span></span></span></span>and <span contenteditable="false" class="atwho-view-flag atwho-view-flag-@"><var data-type="user" class="userHighlight" id="user://82">A Username </var><span contenteditable="false">&nbsp;<span></span></span></span>made it so...

井号:

<var data-type="tag" class="tagHighlight" id="tag://2">#AnotherHashtag </var>

用户提及:

<var data-type="user" class="userHighlight" id="user://82">A Username </var>

总的来说,我的PHP可以正常工作,但有时我会得到不需要的虚假HTML.

最后,preg_replace()中还有一些其他元素用于处理回车,在我的内容可编辑的情况下,这些回车将以< div>< / div>发送.或< br>元素,我需要保留回车符.

希望我已经尽可能清楚地解释了这一切,在此先感谢您的帮助.

解决方法:

也许这对您有帮助

我假设您只是对< var>-标记有兴趣(好吧,出于格式化目的,在< div>和< br>中也是如此),因此只需删除所有其他标记(使用不带正则表达式的字符串函数通常是如果速度不是不重要的更好方法)是PHP function strip_tags(strip_tags($postText,’< var>< div>< br>‘))

替换< var&gt ;、< div>之外的所有其他标签.或< br>和 带空格的实体

$clearedText = str_replace(
    '&nbsp;', 
    ' ', 
    strip_tags($postText, '<var><div><br>')
);

通过trim(…)修剪尾部和前导空格后,将所有空格合并为一个

$clearedText = preg_replace(
    '~\s+~',
    ' ',
    trim($clearedText)
);

替换所有出现的< div>< / div>和< br> Windows换行

$clearedText = preg_replace(
    '~<div></div>|<br\s*/?>~',
    "\r\n",
    $clearedText
);

转换< var>标记< _link>标签

$linkText = preg_replace(
    '~<(var)[^>]*id="((?:tag|user)://\d+)"[^>]*>((?:[^<]+|<(?!/\1>))*)</\1>~',
    '<_link>\2|\2</_link>',
    $clearedText
);

固定< _link>的内容内容为tag:// NUMBER | #HASH且标签内容正确的标签为://:// HASH | #HASH

$linkText = preg_replace(
    '~(?<=tag://)\d+(\|#(\w+))~',
    '\2\1',
    $linkText
);

为了更好地理解最后两个正则表达式:

<(var)[^>]*id="((?:tag|user)://\d+)"[^>]*>((?:[^<]+|<(?!/\1>))*)</\1>

Debuggex Demo

(?<=tag://)\d+(\|#(\w+))

Debuggex Demo

标签:preg-replace,html,php,regex
来源: https://codeday.me/bug/20191029/1959149.html