Andy
Lv 4
Andy 發問時間: 電腦與網際網路程式設計 · 1 0 年前

電腦程式 regular expression

<link href=\"url1\" rel=\"service\" title=\"1\" type=\"application/atom+xml\"/>

<link rel=\"alternate\" type=\"text/html\" href=\"url_here\"/>

---------------------------

<link type=\"application/atom+xml\" href=\"url2\" rel=\"service\" title=\"2\"/>

<link type=\"application/atom+xml\" href=\"url3\" rel=\"service\" title=\"3\"/>

<link href=\"url_here\" rel=\"alternate\" title=\"3\" type=\"text/html\"/>

這是兩個 atom 裡面的一段.

請問如何用 regular expression 取出 url_here 這段.

==========================

只會做到

preg_match_all(\'#<link.*?href=\"(.*?)\".*?/>#s\', $in, $out);

問題是如此一來, 上面的 regular expression 只會取第一個 (url1, url2), 而不是我想要的 (url_here).

請問該如何做才是正確的? 謝謝先.

已更新項目:

對不起, 可能沒有寫得仔細. 我知道程式是可以找出 url_here, 只是不是我想要的答案.

第一例

$outp[1][0] = url1

$outp[1][1] = url_here

-----------------------

第二例

$out[1][0] = url2

$out[1][1] = url3

$out[1][2] = url_here

我想要的方式是, 只取出包含 '

2 個已更新項目:

非常的謝謝你. 接在來是最頭痛的地方.

有些 rel="alternate" 是在 hrel="url_here" 之前, 有些卻是在之後.

這個方式 只能取出 rel="" 是在 href="" 之前的.

再次謝謝!

3 個已更新項目:

發現 preg_match_all('##s', $in, $out); 還是最好的方式.

只是這個方式的答案是,

$out[0] = url1

$out[1] = url_here

$out[0] = url2

$out[1] = url3

$out[2] = url_here

現在需要的是如何只要 裡面, 選出 rel="alternate". 注意 rel="alternate" 可能在 href="url_here" 之前或之後.

4 個已更新項目:

對不起, 我真的有嚴重的溝通問題...

我需要從 xml 裡, 取出 裡, 含有 rel="alternate" 的 hrel="".

我真正需要的是 url_here, 但是必須是 裡面, 包含有 rel="alternate" 的 url_here.

兩種說明的方式... :-p

1 個解答

評分
  • 1 0 年前
    最佳解答

    您的常規式並沒有寫錯!您寫的寫規式可以比對出url_here,我寫了一個程式供您參考:<?$str='<link href="url1" rel="service" title="1" type="application/atom+xml"/><link rel="alternate" type="text/html" href="url_here"/><link type="application/atom+xml" href="url2" rel="service" title="2"/><link type="application/atom+xml" href="url3" rel="service" title="3"/><link href="url_here" rel="alternate" title="3" type="text/html"/>';preg_match_all('/<link.*?href="(.*?)".*?\/>/s',$str,$result);print_r($result);?>這樣是會成功的比對出url_here,請仔細檢查程式碼是否有其它錯誤導致比對失敗。

    2006-04-10 09:25:33 補充:

    常規式請改成:<link\srel=".*?".*?\shref="(.*?)"/>因為您的常規式會將上方的<link.......>全部比對成功!

    2006-04-11 14:46:36 補充:

    如果只要取出rel的話:<link.*?\srel="(.*?)".*?/>把href改成rel就ok了!如果是要取出rel="alternate"<link.*?\s(rel="alternate").*?\/>還是您要取href同時也要取rel?

    2006-04-12 12:06:53 補充:

    我只想到了一個笨方法,因為rel="alternate"會在href的前面或後面,所以也只能用「|」分隔兩個不同常規式,<link.*rel="alternate"*.*href="(.*)".*/>|<link.*href="(.*)".*rel="alternate"*.*/>

    參考資料: 自己
    • 登入以對解答發表意見
還有問題?馬上發問,尋求解答。