[英]preg_match_all for special characters [?]
我有一個 URL:
https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D
我想使用 preg_match_all 匹配它。 我的正則表達式是:
preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/(?)\/.*\">D)/', $input_lines, $output_array);
但我無法匹配特殊字符?
在上面的代碼中。 我嘗試使用(?)
。 但它不匹配。 我知道這可能是一個蹩腳的問題,但如果有人可以幫助我匹配?
還是在 escaping 中?
在 preg_match_all 中,這會很有幫助。
我只是注意到在 ac 之后沒有/
in 鏈接,但是您在正則表達式中添加了它,所以只需嘗試刪除它或使用下面的代碼,它的工作和測試。
<?php
$input_lines = 'https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';
preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)(\?).*\">D)/', $input_lines, $output_array);
var_dump($output_array);
這是 output - https://prnt.sc/weq86u
或者如果在ac/?
可能會發生,那么您可以嘗試在正則表達式中使用/
作為可選參數
<?php
$input_lines = 'https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';
preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/?(\?).*\">D)/', $input_lines, $output_array);
var_dump($output_array);
它將匹配有或沒有/
https://prnt.sc/weqbae的兩個鏈接
/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/(?)\/.*\">D)/
^ ^ ^ ^ ^ ^ ^ ^
1 2 2 3 4 5 6 1
+-- Starting delimiter | | | | | | +-- Ending delimiter
| | | | | +-- This is a greedy match and may not stop where intended
| | | | +-- `?` is a special character in Regex and does nothing in this scenario; the .* is actually matching the `?`
| | | +-- This slash doesn't exist
| | +-- No need for a capture group
+----+-- No need for a character set
正則表達式模式分隔符:
...標記模式的開始和結束; 類似於標記字符串開頭和結尾的單引號/雙引號
與引號一樣,如果您在模式中使用分隔符,則必須對其進行轉義
為避免 escaping 您可以使用不同的分隔符
Pattern 1: /https:\/\/www\.website\.com\/page\/1\/\index.php/ Pattern 2: ~https://www\.website\.com/page/1/index\.php~
2.由於您只想從字面上匹配字符,您可以簡單地使用模式中的字符。 如果字符可以是多個值,您只需要一個字符集
Set Matched value
u ===> u
[u] ===> u
[ua] ===> u OR a
與2
一樣,您在這里不需要捕獲組,因為您只對捕獲整個字符串感興趣。 這會將$output_array[1] = "ac"
添加到您的 output
出於某種原因,您嘗試匹配 URL 中不存在的/
,因此該模式將永遠不會返回任何內容
?
是正則表達式中的特殊字符; 通常它用於組的開頭( a
),修改量詞( b
),或暗示構造是可選的( c
)。 在這種情況下(?)
絕對什么都不做; .*
匹配文字?
或者如果斜線不在模式中,就會這樣做。
一個。 在組中使用?
可以表示,例如:
(?:...) ===> Non-capturing group (?=...) ===> Positive lookahead (?....) ===> Negative lookahead
灣。 修改量詞:通常量詞+
或*
會是貪婪的並且盡可能匹配。 放置一個?
在它使它變得不貪婪並在第一種可能性處停止之后
String: IIIIOIIIOIIIO Pattern Match /I.*O/ IIIIOIIIOIIIO /I.*?O/ IIIIO
c。 使構造可選
Pattern Match 1 Match 2 Explanation ~https?://~ http:// https:// Optional character ~(?:www\.)?website.com~ website.com www.website.com Optional non-capturing group
根據5b
,這是一個貪心量詞,因此,例如,如果模式\">D
在字符串中出現多次,則匹配直到最后一次出現。
即,如果您的字符串中有多個 URL ,那么它將從第一個匹配到最后一個,而不是單獨匹配它們
String: <a href="website.com?id=2432546t4534">Link 1</a><a href="website.com?id=24345yr6787">Link 2</a> Pattern Matches ~website.com\?id=.*">~ [1] website.com?id=2432546t4534">Link 1</a><a href="website.com?id=24345yr6787"> ~website.com\?id=.*?">~ [1] website.com?id=2432546t4534"> [2] website.com?id=24345yr6787">
更新的正則表達式
~https://my\.site\.com/u/0/ac\?.*?">D~
~ : Starting delimiter
https://my\.site\.com/u/0/ac : Matches the initial part of the URL
\? : Matches a literal ?
.*? : Non-greedy match any character 0 or more times
">D : Match string literally
~ : Ending delimiter
代碼
$input_lines = 'https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';
preg_match_all('~https://my\.site\.com/u/0/ac\?.*?">D~', $input_lines, $output_array);
print_r($output_array);
Output
Array
(
[0] => Array
(
[0] => https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.