[英]What does these regular expressions mean in this code?
当我遇到joomla插件的这一部分时,我试图对其进行更改,但我不知道它在做什么。
有人可以告诉我这些正则表达式和${4}
是什么?
$comStart = '';
$comEnd = '';
$output = JResponse::getBody();
$output = preg_replace('/\<meta name=\"og\:/', '<meta property="og:', $output);
$output = preg_replace('/\<meta name=\"fb:admins/', '<meta property="fb:admins', $output);
$output = preg_replace('/<(\w+) (\w+)="(\w+):(\w+)" (\w+)="([a-zA-Z0-9\ \_\-\:\.\&\/\,\=\!\?]*)" \/>/i', $comStart.'<${1} ${2}="${3}:${4}" ${5}="${6}" >'.$comEnd, $output);
仅供参考:此插件用于在文章内显示facebook和opengraph标签。
认真的注意!
不建议使用正则表达式来解析/匹配HTML / XML。 认真一点, 不要做
基本上,它是用于解析/匹配HTML的正则表达式。 这可能会带来一些副作用,如不工作 , 难以维护和精神错乱 。
${N}
称为反向引用,它们引用正则表达式中匹配的第N个括号。
如果需要在PHP中对HTML字符串进行操作,则应使用为此专门创建的DOMDocument
类。
<?php
$html_string = <<<HTML
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="target">
This is the target DIV! <span>This span will change texts!</span>
</div>
</body>
</html>
HTML;
$dom = new DOMDocument();
// Loading HTML from string...
$dom->loadHTML($html_string);
//Retrieve target and span elements
$target = $dom->getElementById("target");
$span = $target->getElementsByTagName("span")->item(0);
//Remove text, firstChild is the text node.
$span->removeChild($span->firstChild);
//Append new text
$span->appendChild(new DOMText("This is the new text!"));
//Change an attribute
$span->setAttribute("class", "spanny");
//Save HTML to string
$html_string = $dom->saveHTML();
echo $html_string;
正则表达式不是坏,邪恶或可怕的东西,它们只是工作的错误工具 ,您不会用手提钻钉钉子吗?
$output = preg_replace('/\<meta name=\"og\:/', '<meta property="og:', $output);
将字符串<meta name="og:
替换为<meta property="og:
毫无意义-这里不需要正则表达式。
$output = preg_replace('/\<meta name=\"fb:admins/', '<meta property="fb:admins', $output);
将<meta name="fb:admins
替换为<meta property="fb:admins
。 就像没有意义一样-这里不需要正则表达式。
$output = preg_replace('/<(\w+) (\w+)="(\w+):(\w+)" (\w+)="([a-zA-Z0-9\ \_\-\:\.\&\/\,\=\!\?]*)" \/>/i', $comStart.'<${1} ${2}="${3}:${4}" ${5}="${6}" >'.$comEnd, $output);
替换字符串,如<word1 word2="word3:word4" word5="word6withspecialcharacterslike-:.etc." />
<word1 word2="word3:word4" word5="word6withspecialcharacterslike-:.etc." />
带有<word1 word2="word3:word4" word5=word6withspecialcharacterslike-:.etc." >
。因此,它仅在结束>
之前删除尾部斜杠。非常怀疑和类似于Voodoo的正则表达式。
而且,所有这些正则表达式都非常优雅(例如,很多无意义的转义),并表明编写这些正则表达式的人对正则表达式并不了解。 在HTML上放这样的东西是自找麻烦。
避免! 避免! 避免!
每个(\\w+)
都说找到一个单词并将其存储。 因此,您正在执行此操作(使用伪代码)
find /(word1) (word2)="(word3)" (word4)="(manypossiblechars5)"/ignoring case
replace pattern with $comStart.<word1 word2="word3:word4" manypossiblechars5="word6">.$comEnd
第一个尝试用<meta property="og:...
替换形式为<meta name="og:...
标签<meta property="og:...
第二个类似的替代标签开始<meta name="fb:admins...
与<meta property="fb:admins...
最后,第三个似乎采用了<word word="word:word" word="something" \\/>
形式的标签,并用$comStart
和$comEnd
包装它们。
这是通过匹配标记的各个部分()
在它们周围放置()
),然后使用反向引用(例如${4}
来引用第4个匹配的部分来完成的。
这里$comStart
和$comEnd
设置为'',所以似乎没有意义。 它还可以同时消除标签的斜杠,尽管谁知道这是故意的!
这些表达式尝试通过以下方式修复文档头代码:
<meta name="og:*"
重写为` <meta name="fb:admins"
重写为<meta property="fb:admins"
这只是可怕的代码,只要您的模板中没有这些“错误”,您就可以扔掉这些废话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.