2013-05-31 36 views
0

這是我第一次用正則表達式做任何事情,我得到這個錯誤,我找不到任何關於。未知的修飾語'n'

對於此示例,我想返回「Dan Harmon」。

$url = 'http://imdb.com/title/tt1439629/'; 
$pattern = '/\/<h4\sclass="inline">Creator:<\/h4>\r<a\shref="\/name\/nm[0-9]{7}\/\?ref\_=tt\_ov_wr"\sitemprop=\'url\'><span\sclass=\"itemprop"\sitemprop=\"name\">(.*?)<\/span><\/a>/g/'; 

$imdb = file_get_contents($url); 

preg_match($pattern, $imdb, $match); 

var_dump($match); 

添加我的缺失反斜槓,這仍然不會返回任何東西,請任何人都可以幫忙嗎?

感謝

+1

你最好從一個簡單的例子開始,如果這是你第一次使用正則表達式! – fedorqui

+0

@fedorqui他不得不學習它嗎? –

+3

'/ nm [0-9]' - 你需要用'\ /' –

回答

1

我就不說了,最好的方式從網頁中提取一些數據是使用DOM文檔,XPath的,simpleXML ... 當你用很多斜槓對待html或url時,首先要做的是爲/ regex選擇另一個分隔符。例如:

$pattern = '~<h4 class="inline">Creator:</h4>\s*<a [^>]+><span [^>]+>\K[^<]+~'; 
if (preg_match($pattern, $imdb, $match)) 
    print_r($match); 

與另一個分隔符比/(〜這裏)你不需要逃避所有的斜槓(=少潛在的錯誤)

要沒有描述所有的標籤內容我使用:[^>]+ - - >所有這不是一個>一次或多次

\K =忘記所有已上看到左邊 (換句話說,之前所有的模式\ K被測試,但會從最終結果中刪除) 。有了這個技巧,你不需要一個捕捉組,因爲你的整個模式是結果。

+0

感謝您的回答,您能否詳細解釋一下您對該模式做了什麼? – Callombert

+0

除此之外,我明白這一點:\ K =忘記你在左邊看到的所有東西? – Callombert

+0

非常感謝! – Callombert

1

你忘了逃跑href="\/name/之後,因此它被視爲結束符和一切後,試圖解析爲改性劑。

2

..\/name/nm[0-9]{7}..後名稱有一個未轉義的正斜槓和腳本認爲它是該模式的結束,修改器n,m等。確保所有正斜槓轉義\/,或選擇其它的字符限制模式界限,例如#@

0

由於您在表達式中使用了.*?,因此應該包含搜索選項s以確保.也與新行符相匹配。

<?php 
$sourcestring="your source string"; 
preg_match_all('/your regex/is',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 


i = case insensitive 
m = multi line `^` and `$` match at line breaks 
x = ignore whitespace in the pattern, used for adding comments to the regex to help keep it human readable 
s = dot matches all characters including new line