0

HTML ページを PHP 文字列に作成し、それをユーザーに配信する Web スクリプトがあります。すべてのページは、一意の URL を持つ index.php によって生成されます。

domain.host.com/index.php?loadpage=/BLAH

ホームページは静的 HTML ですが、他のすべてのページはこの PHP 文字列に動的に生成されます。できるだけ多くの情報を提供しようとしているだけで、とりとめのないように思えるかもしれません。リンクの URL を変更するための JavaScript コードを作成しました。

 <a href="http://domain.com/BLAH" onclick="location.href='?loadpage=/BLAH'; return false;" title="BLAH Description">BLAH Link</a>

これは基本的にステータスバーに素敵なきちんとしたリンクを表示しますが、javascriptはそれを必要なURLに送信します(これはにあるので、URLバーを変更する必要はありませんiframe

これらのリンクは、静的ページでは問題ありません。しかし、動的に生成された PHP 文字列内のページでは、少し難しくなります。次のすべての文字列を検索する必要があります。

href="?loadpage=/ [WILDCARD] " title=

そしてそれを次のように置き換えます:

href="http://domain.com/ [WILDCARD] " onclick="location.href='?loadpage=/ [WILDCARD] '; return false;" title=

これは私には非常に複雑に思えます。 ereg/ preg match/である可能性があると思いますreplaceが、正規表現についての手がかりがありません。

簡単にまとめると、ページ全体の html を含む php 文字列を検索し、最初の文字列を 2 番目の文字列に置き換える何らかの方法が必要です (「?loadpage/」を含むリンクが出現するたびに。しかし、各リンクには異なる[WILDCARD]ので、スクリプトはすべての出現を見つけ[WILDCARD]、変数に保存し、置換機能を実行し、最初のURLから変数として保存されたばかりの単語を挿入する必要があると推測しています。

編集。

元のリンクがどのように見えるかを明確にするために:

<a id="random" href="?loadpage=/BLAH" title="BLAH Title"></a>

hrefこれが、属性からのみ検索している理由です。

4

1 に答える 1

0

そうです、必要なのは正規表現です。(ワイルドカード置換の必要性が手がかりです)。この回答は完全な解決策ではありません。正規表現がどのように機能するかを理解してください。これをphpに統合するのはあなたに任せます(preg_match_allを試してください)

一致させたいパターンは次のとおりです。

"\?loadpage=\/([^"]*)"

\ は、正規表現で特別な意味を持つ文字のエスケープです

したがって、エスケープを無視すると、これは

"?loadpage=/   //the start of the string up to the wildcard part

()   // capturing parentheses, indicating a part that 
     // you want to access in the replace string

[^"]*  // any number of occurences of any character that is NOT doublequote
       // ^ is the negation symbol
       // * indicates "zero or more occurrences"


    followed by...
"   doublequote character

ここで、置換文字列が必要です...これについては、(キャプチャ括弧) を使用して一致のその部分を呼び出すことができることを知っておく必要があります。ほとんどの正規表現フレーバーでは、これらを通常 $1、$2、$3.. \1 \2 \3... として表される一連番号の変数にキャプチャできます。この場合、処理するキャプチャ変数は 1 つだけです。

したがって、置換文字列は次のようになります

"http://domain.com/$1/" onclick="location.href='?loadpage=/$1'; return false"

perl では、全体を次のようにまとめます。

$string =~ s|"\?loadpage=\/([^"]*)"|"http://domain.com/$1/" onclick=\"location.href='?loadpage=/$1'\; return false"|g;

引用符をエスケープする必要がないことに注意してください。これはphpで異なる場合があります。

ご覧のとおり、簡単に非常に不可解になります。regular-expressions.infoは便利なオンライン リファレンスです。


見ているものがわかるように(phpでこれを行う必要はありません)...

=~perl 正規表現演算子です (php では使用しません。preg_match のドキュメントを参照してください)。

次に、フォームがあります

s|match_pattern|replace_pattern|g;

ここで、s は置換を示します (単純な一致ではなく) g はグローバル一致を示します (そうでない場合、プロセスは最初の一致で停止します) ||| セパレーターです。通常は /// と書かれますが、URL の // をすべてエスケープする必要があり、判読しにくくなります。

しかし、これは perl 固有の詳細になりすぎています。php 正規表現のドキュメントを読んでください!

于 2013-01-10T22:43:45.430 に答える