1

私は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タグを表示するためのものです。

4

5 に答える 5

3

重大な注意!

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;

正規表現は悪い、悪い、または怖いものではありません、それらは単に仕事のための間違ったツールです、あなたは削岩機で釘を刺しませんか?

于 2012-06-12T15:04:29.407 に答える
3
$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." >。したがって、閉じる前に末尾のスラッシュを削除するだけ>です。非常に疑わしく、ブードゥー教のような正規表現の使用。

また、これらの正規表現はすべて非常にエレガントではなく(たとえば、無意味なエスケープがたくさんあります)、それらを書いた人は誰でも正規表現についてあまり知らないことを示しています。このようなものをHTMLで緩めることは、問題を引き起こします。

避ける!避ける!避ける!

于 2012-06-12T15:07:51.610 に答える
2

それぞれ(\w+)が単語を見つけて保存すると言います。だからあなたはこれを(擬似コードで)やっています

find /(word1) (word2)="(word3)" (word4)="(manypossiblechars5)"/ignoring case

replace pattern with $comStart.<word1 word2="word3:word4" manypossiblechars5="word6">.$comEnd
于 2012-06-12T15:07:10.207 に答える
2

これらの式は、次の方法でドキュメントのヘッドコードを修正しようとします。

  1. <meta name="og:*"`に 書き直し
  2. <meta name="fb:admins"に書き換える<meta property="fb:admins"
  3. ぶら下がっているスラッシュのあるメタタグを、それがないものに書き換えます(常に2つの属性があると仮定します。

これは恐ろしいコードであり、テンプレートにこれらの「間違い」が含まれていない限り、このがらくたを捨てることができます。

于 2012-06-12T15:11:30.513 に答える
2

最初のものは、フォームのタグを次のように置き換えようとし<meta name="og:...ます<meta property="og:...

2つ目も同様に、で始まるタグを置き換え<meta name="fb:admins...ます<meta property="fb:admins...

最後に、3番目はフォームのタグを取り、それらをと<word word="word:word" word="something" \/>でラップしているようです。$comStart$comEnd

これは、タグの部分を一致させ(それらの周りに配置)、次に一致した4番目の部分を参照する()などの後方参照を使用することによって行われます。${4}

ここ$comStart$comEndは''に設定されているので、少し意味がないようです。また、タグの終了スラッシュを同時に取り除くこともできますが、それが意図的なものかどうかは誰にもわかりません。

于 2012-06-12T15:08:53.697 に答える