0

URLグラバーを設定しましたが、正常に機能していました。次のような応答ヘッダーにあるドキュメントのURLを取得します。

<script type='text/javascript' language='JavaScript'>
document.location.href = 'http\x3a\x2f\x2fcms.example.com\x2fd\x2fd\x2fworkspace\x2fSpacesStore\x2f61d96949-b8fb-43f1-adaf-0233368984e0\x2fFinancial\x2520Agility\x2520Report.pdf\x3fguest\x3dtrue'
</script>   

これが私のグラバースクリプトです。

<?php

set_time_limit(0);
$target_url = $_POST['to'];
$html =file_get_contents($target_url);

$pattern = "/document.location.href = '([^']*)'/";
preg_match($pattern, $html, $matches, PREG_OFFSET_CAPTURE, 3);

$raw_url = $matches[1][0];
$eval_url = '$url = "'.$raw_url.'";';

eval($eval_url);
echo $url;

ドキュメント管理システムに変数を追加する必要があったため、各ドキュメントのURLにはURLの最後に?guest=trueが必要でした。これを行うと、グラバーは完全なURLを返し、それをファイル名に追加します。そこで、/ guest = trueに達するまで、URLだけを取得するようにしました。このコードで:

<?php

set_time_limit(0);

$target_url = $_POST['to'];
$html =file_get_contents($target_url);

$pattern = "/document.location.href = '([^']*)\x3fguest\x3dtrue'/";

preg_match($pattern, $html, $matches, PREG_OFFSET_CAPTURE, 3);

$raw_url = $matches[1][0];
$eval_url = '$url = "'.$raw_url.'";';

eval($eval_url);
echo $url;

なぜ?guest = trueの部分までURLを返さないのですか?別名、なぜこれが機能しないのですか?そして、修正は何ですか?

4

2 に答える 2

1

これが解決策です。グループではなく、直接試合を行います。

set_time_limit(0);

$target_url = $_POST['to'];
$html = file_get_contents($target_url);

$pattern = '/(?<=document\.location\.href = \').*?(?=\\\\x3fguest\\\\x3dtrue)/';

preg_match($pattern, $html, $matches))

$raw_url = $matches[0];
$eval_url = '$url = "'.$raw_url.'";';

eval($eval_url);
echo $url;

ここで結果を確認できます。

.正規表現の問題は、文字列(および\)内の文字をキャッチしたい特定の文字をエスケープしなかったという事実にありました。PREG_OFFSET_CAPTUREさらに、のオフセットを使用する必要はありません3このページの例からこれらの値をコピーしたと思います。

正規表現パターンの説明は次のとおりです。

# (?<=document\.location\.href = ').*?(?=\\x3fguest\\x3dtrue)
# 
# Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=document\.location\.href = ')»
#    Match the characters “document” literally «document»
#    Match the character “.” literally «\.»
#    Match the characters “location” literally «location»
#    Match the character “.” literally «\.»
#    Match the characters “href = '” literally «href = '»
# Match any single character that is not a line break character «.*?»
#    Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
# Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=\\x3fguest\\x3dtrue')»
#    Match the character “\” literally «\\»
#    Match the characters “x3fguest” literally «x3fguest»
#    Match the character “\” literally «\\»
#    Match the characters “x3dtrue” literally «x3dtrue»

この回答は、質問の更新を反映するように編集されています。

于 2012-09-07T22:56:26.610 に答える
0

あなたの正規表現が間違っているようです。文字通り\?guest=true一致する正規表現に追加しました。?guest=true

応答ヘッダーの例では、 で終わりますが\x3fguest\x3dtrue、これは異なります。

試す:

$pattern="/document.location.href = '([^']*)(\?|(\\x3f))guest(=|(\\x3d))true'/";

次の部分式を単純に置き換えました。

  • \?現在(\?|(\\x3f))、どちらが一致?するか、\x3f文字通りです
  • = 現在(=|(\\x3d))、どちらが一致=するか、\x3d文字通りです

そうすれば、?orのエスケープされた 16 進表現=が使用されても、正しく一致します。

于 2012-09-07T22:45:00.143 に答える