gpt4 book ai didi

php - 有趣的 PHP 正则表达式 (preg_replace)

转载 作者:可可西里 更新时间:2023-11-01 01:01:20 24 4
gpt4 key购买 nike

所以我有一个表单元素正在提交给我构建的应用程序中的 Controller /模型,我需要删除任何不符合我要求的 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);

我正在使用一个 contenteditable 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() 中还有一些其他元素它处理回车,在我的 contenteditable 的情况下被发送为 <div></div><br>元素,我需要保留回车符。

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

最佳答案

也许这对你有帮助

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

替换<var> 以外的所有 标签, <div><br>&nbsp;带空格的实体

$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将正确的内容发送到 tag://HASH|#HASH

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

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

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

Regular expression visualization

Debuggex Demo


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

Regular expression visualization

Debuggex Demo

关于php - 有趣的 PHP 正则表达式 (preg_replace),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24860126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com