将自定义降价转换为 HTML?
Convert custom markdown to HTML?
挑战: 我们的用户可以访问一个 "contentEditable" DIV,其中 JS 库插入了 HTML。以下是我们认为 HTML 应该出现在 contentEditable 中的方式:
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
我们把这个HTML交给PHP,在这里我们执行strip_tags()。这应该给我们:
[data-user="12345" data-userId="678910"]John Smith[/] ...Blablabla some other text...
问题: 在页面上渲染文本时,我们想知道是否有 secure/reliable 方法将上面的自定义 markdown 转换为(在传递之前至 Handlebars.js) :
<span class="stylish-blue-button" data-user="12345" data-userId="678910">John Smith</span> ...Blablabla some other text...
原因: 这让我们确信用户生成的内容已得到安全处理,同时将用户生成的降价保留在 contentEditable "pretty" ("stylish-blue-button" class).
如果您有任何简化整个过程的建议,我们愿意更改我们的 markdown 格式。
非常感谢!
您可以使用这样的正则表达式:
$string = '<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...';
echo preg_replace('~\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*(.*)~s', '<span ></span>', trim(strip_tags($string)));
这里 regex101 demo 解释了正则表达式的作用。如果您有特定问题,请提出。
输出:
<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...
一些快速的正则表达式注释。
*
是一个量词,表示前面字符的零个或多个。
+
是一个量词,表示前一个字符的一个或多个(也就是必需的)。
\s
是一个白色space字符。
\h
是横向 space.
.
是任意单个字符。
\d
是一个数字 (0-9)。
()
正在捕获他们捕获到 </code>、<code>
等的组。
再次查看该正则表达式的快速说明:此 \[/\]
被读取为文字 [/]
。反斜杠正在转义 []
,否则会创建一个字符 class(意味着那里只允许使用 /
字符)。
多实例:
$string = '<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...';
echo preg_replace('~\s*\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*~s', '<span ></span>', trim(strip_tags($string)));
输出:
<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...
对于更宽松的 ID,只需将 \d+
更改为 [a-zA-Z0-9 ]+
。
所以:
preg_replace('~\s*\[(data-user="\d+")\h+(data-userId="[a-zA-Z0-9 ]+")\]\s*(.+?)\s*\[/\]\s*~s'
挑战: 我们的用户可以访问一个 "contentEditable" DIV,其中 JS 库插入了 HTML。以下是我们认为 HTML 应该出现在 contentEditable 中的方式:
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
我们把这个HTML交给PHP,在这里我们执行strip_tags()。这应该给我们:
[data-user="12345" data-userId="678910"]John Smith[/] ...Blablabla some other text...
问题: 在页面上渲染文本时,我们想知道是否有 secure/reliable 方法将上面的自定义 markdown 转换为(在传递之前至 Handlebars.js) :
<span class="stylish-blue-button" data-user="12345" data-userId="678910">John Smith</span> ...Blablabla some other text...
原因: 这让我们确信用户生成的内容已得到安全处理,同时将用户生成的降价保留在 contentEditable "pretty" ("stylish-blue-button" class).
如果您有任何简化整个过程的建议,我们愿意更改我们的 markdown 格式。
非常感谢!
您可以使用这样的正则表达式:
$string = '<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...';
echo preg_replace('~\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*(.*)~s', '<span ></span>', trim(strip_tags($string)));
这里 regex101 demo 解释了正则表达式的作用。如果您有特定问题,请提出。
输出:
<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...
一些快速的正则表达式注释。
*
是一个量词,表示前面字符的零个或多个。
+
是一个量词,表示前一个字符的一个或多个(也就是必需的)。
\s
是一个白色space字符。
\h
是横向 space.
.
是任意单个字符。
\d
是一个数字 (0-9)。
()
正在捕获他们捕获到 </code>、<code>
等的组。
再次查看该正则表达式的快速说明:此 \[/\]
被读取为文字 [/]
。反斜杠正在转义 []
,否则会创建一个字符 class(意味着那里只允许使用 /
字符)。
多实例:
$string = '<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...
<span class="stylish-blue-button">
<span style="display:none;">[data-user="12345" data-userId="678910"]</span>
John Smith
<span style="display:none;">[/]</span>
</span>
...Blablabla some other text...';
echo preg_replace('~\s*\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*~s', '<span ></span>', trim(strip_tags($string)));
输出:
<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...<span data-user="12345" data-userId="678910">John Smith</span>...Blablabla some other text...
对于更宽松的 ID,只需将 \d+
更改为 [a-zA-Z0-9 ]+
。
所以:
preg_replace('~\s*\[(data-user="\d+")\h+(data-userId="[a-zA-Z0-9 ]+")\]\s*(.+?)\s*\[/\]\s*~s'