繁体   English   中英

这些正则表达式在代码中是什么意思?

[英]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设置为'',所以似乎没有意义。 它还可以同时消除标签的斜杠,尽管谁知道这是故意的!

这些表达式尝试通过以下方式修复文档头代码:

  1. <meta name="og:*"重写为`
  2. <meta name="fb:admins"重写为<meta property="fb:admins"
  3. 不用斜线将斜杠改写成一个斜杠(假设斜杠始终具有两个属性。

这只是可怕的代码,只要您的模板中没有这些“错误”,您就可以扔掉这些废话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM