2014-06-15 35 views
0

我已經嘗試了很多不同的組合,爲了得到這個功能,結果從「沒有結果」變成簡單地產生各種錯誤。 我所試圖做的是搜索包含一部分的單詞或數字網頁上的所有指定鏈接...比如這個作品:Xpath大小寫敏感查詢來解析超鏈接

$nodes = $xpath->query('//a[contains(@href, \'sweet\')]/@href'); 

並搜尋任何部分包含「甜」所有的HREFs的href ...問題它是區分大小寫的,幾乎所有的URL都包含PHP查詢字符串,用戶名允許在字符串中混合使用大寫和小寫字母,所以這是我的許多失敗嘗試之一,並且使查詢大小寫不敏感:

$nodes = $xpath->query('//a[contains(translate(\'ABCDEFGHIJKLMNOPQRSTUVWXYZ\',\'abcdefghijklmnopqrstuvwxyz\'),\'@href\', \'sweet\')]/@href'); 

我想我在正確的軌道上,但有語法錯誤?

回答

1

請嘗試

$nodes = $xpath->query('//a[contains(translate(@href, 
               \'ABCDEFGHIJKLMNOPQRSTUVWXYZ\', 
               \'abcdefghijklmnopqrstuvwxyz\' 
              ), 
            \'sweet\' 
            ) 
          ]/@href'); 

代替。

+0

這樣搜索得很好,但它仍然區分大小寫......它會匹配'甜'但不'甜'...感謝您的幫助。 – user2495392

+0

我只是想,也許我可以將整個網頁解析爲數組中的大寫或小寫,然後執行搜索?聽起來可能過度。 – user2495392

+0

我正在尋找的一個典型的href示例看起來像這個http://example.com/livecam.php?username=SweetStella&c=1768,但大寫和小寫字母可以在字符串的任何部分,而不只是在用戶名= – user2495392

0

使用fn:containsfn:translate是錯誤的方法,這可以通過您完成這項簡單任務的複雜程度來證明。

如果你有XPath 2.0中,你也可以使用fn:matches,例如:

$nodes = $xpath->query("//a[matches(@href, 'sweet', 'i')]/@href"); 

注意,第三參數FN:比賽是一些標誌來控制表達式的值,在這種情況下,我們指定了i這意味着比較是不區分大小寫的。可以說,您的查詢也可以簡化爲:

$nodes = $xpath->query("//a/@href[matches(., 'sweet', 'i')]"); 

如果你是卡在XPath 1.0中,那麼你可以簡單地用一個or表達有兩個fn:contains表達式,例如:

$nodes = $xpath->query("//a/@href[contains(., 'sweet') or contains(., 'SWEET')]"); 

而且XQuery中你可以使用單引號或雙引號,這樣爲了使你的代碼更具可讀性,我使用了單引號,這樣你就不需要從PHP代碼中跳出XQuery中的雙引號。

+0

嗨,你的版本只是拋出錯誤,我已經嘗試了使用'我'開關的許多版本,並導致相信它不會在xpath查詢中,當我找到'abcd ....'等方式,並開始玩... ...感謝您看看 – user2495392

+0

啊好吧,這聽起來像你被困在XPath 1.0。這太糟糕了,因爲與XPath 2.0或3.0相比,它確實很差。我的例子是在XQuery 2.0中。我添加了更新的XQuery 1。0版本以及... – adamretter