あなたのコード
$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';
まず、呼び出し$matches
の前に定義する必要はありません。preg_match
変数名を指定するだけで、通知PHP
をスローすることはありません。
第二に$search
、質問に関連していないようです?..
3番目...入力例を示していないことを念頭に置いて、入力からすべてのリストを取得できるように、実際に必要であると仮定します。preg_match_all
URLs
4 つ目は、3 つに続いて、 のコンテンツとしてvar_dump
orprint_r
の代わりにが必要であることを意味します。echo
$matches[X]
array
正規表現
さて、正規表現パターンが実際に行うことについて...
(<a\s*[^>]*href=['"]?)
(
- キャプチャ グループを開始します
<a\s*
- 0 個以上の空白文字<a
が続く一致
[^>]*
- ではない0 個以上の文字に一致>
href=
- マッチhref=
['"]?
- オプションで、'
または"
)
- キャプチャ グループを終了します
これはすべて、例の入力に対して実行すると、正規表現が<a href="
最初のリンクの例 (google) と<a class="fancyStyle" href="
2 番目のリンクの例 (youtube) から一致することを意味します。
/**
Output from:
preg_match_all('|(<a\s*[^>]*href=[\'"]?)|', $string, $matches);
var_dump($matches);
*/
array(2) {
[0]=>
array(2) {
[0]=>
string(9) "<a href=""
[1]=>
string(28) "<a class="fancyStyle" href=""
}
[1]=>
array(2) {
[0]=>
string(9) "<a href=""
[1]=>
string(28) "<a class="fancyStyle" href=""
}
}
作業コード
コードにはいくつかの問題がありますが、期待どおりの結果を得るのを妨げているのは、到達する前にURL
キャプチャを停止することです。
次の正規表現は、タグの属性URL
内にある に一致します。href
a
#<a\s.*?(?:href=['"](.*?)['"]).*?>#is
説明
<a
a
-タグの開始に一致
\s.*?
-任意の文字が0回以上続く空白文字に一致します
(?:
- 非キャプチャ グループを作成します
href=
- マッチhref=
['"]
'
- またはのいずれかに一致"
(.*?)
- キャプチャ グループを作成し、前に0 個以上の文字を一致させます...
['"]
- 一致'
または"
)
- 非キャプチャ グループを終了します
.*?>
- 任意の文字に 0 回以上一致し、その後に続く>
i
- 正規表現の大文字と小文字を区別しないようにします
s
-.
すべての文字に一致させます (改行を含む)
実施例
preg_match_all('#<a\s.*?(?:href=[\'"](.*?)[\'"]).*?>#is', $string, $matches);
var_dump($matches);
/**
array(2) {
[0]=>
array(2) {
[0]=>
string(34) "<a href="http://www.google.co.uk">"
[1]=>
string(65) "<a class="fancyStyle" href="http://www.youtube.com" id="link136">"
}
[1]=>
array(2) {
[0]=>
string(23) "http://www.google.co.uk"
[1]=>
string(22) "http://www.youtube.com"
}
}
*/
入力例
すべてのコードは、preg_match
関数への入力として以下を使用します...
$string = <<<EOC
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title of page</title>
</head>
<body>
<h1>Main Page title</h1>
<p>
The following is a <a href="http://www.google.co.uk">link to google</a>.
This is <a class="fancyStyle" href="http://www.youtube.com" id="link136">another link</a>
</p>
</body>
</html>
EOC;