1

正则表达式:

preg_match('/<td[^<^>]*>(.*?)<\/td><td[^<^>]*>'.preg_quote('<input type=\'text\' name=\'nazwisko\'>', '/').'<\/td>/Ui', $form_string, $matches);

输入:

<form action='http://freebot.pl/post.php' name='implebot.plSHOW' method='post' onsubmit='return SprawdzFormularz(this)'>
        <table><tr><td align=right>

        <input type='hidden' name='uid' value='60431'>
        Email :</td><td><input type='text' name='email'></td></tr>
    <tr><td align=right>Imię :</td><td><input type='text' name='imie'></td></tr><tr><td align=right>Nazwisko :</td><td><input type='text' name='nazwisko'></td></tr><tr><td align=right>#opcja1 :</td><td><input type='text' name='pole_1' value='war.1'></td></tr><input type='hidden' name='pole_2' value='war.2'><tr><td align=right>#opcja3 :</td><td><select name='pole_3'><option></option><option value='s1'>s1</option><option value='s2'>s2</option><option value='s3'>s3</option><option value='s4'>s4</option><option value='s5'>s5</option></select><tr><td align=right>#opcja4 :</td><td><select name='pole_4'><option></option><option value='a'>a</option><option value='b'>b</option><option value='c'>c</option><option value='d'>d</option><option value='e'>e</option><option value='f'>f</option><option value='g'>g</option></select><tr><td align=right>#opcja5 :</td><td><input type='text' name='pole_5' value='war.5'></td></tr></table><input type='hidden' name='zrodlo' value='formularz1'>Zgadzam się z <input type='checkbox' name='pp' checked><a href='http://' >polityką prywatności</a><br><input type='submit' value='Wyślij'></form>

$匹配[1]:

<input type='hidden' name='uid' value='60431'>Email :</td><td><input type='text' name='email'></td></tr><tr><td align=right>Imi─Ö :</td><td><input type='text' name='imie'></td></tr><tr><td align=right>Nazwisko :

代替:

Nazwisko :

(.*?)进去<td[^<^>]*>(.*?)<\/td>了应该给我预期的Nazwisko :

我做错了什么?

4

2 回答 2

1

/U意味着在贪婪和不贪婪之间切换是相反的:.*是不贪婪的,.*?是贪婪的。

于 2013-05-13T18:04:52.130 回答
0

我看不出有任何理由在这种模式中使用不贪婪的量词。试试这个:

preg_match('~<td[^>]*>([^<]*)</td><td[^>]*>'
          .preg_quote("<input type='text' name='nazwisko'>")
          .'</td>~i', $form_string, $matches);

如果 td 标签可以包含 html 内容,则可以替换([^<]*)((?>[^<]+|<+(?!/td>))*)

解释:

(?>             # atomic group
    [^<]+       # all characters expect < one or more times
   |            # OR
    <+(?!/td>)  # < one or more times not followed by /td> (negative lookahead)
)*              # close atomic group, 0 or more times

也就是说,这部分匹配:所有不是<或<后面不跟/td>的字符,每次1次以上,这都0次以上。它比它长一点,(.*?)但它更有效。

原因是正则表达式引擎必须逐个测试每个字符是否跟随</td>不贪婪模式。在我的模式中,正则表达式引擎仅在字符为<.

我尽可能使用原子组(?>...)而不是非捕获组(?:...),作为一种好习惯,您可以在此处找到更多信息。

于 2013-05-13T18:53:04.280 回答