正则表达式不同

时间:2018-06-11 22:45:51

标签: html regex match

你好我希望匹配一个表标签,后跟任何字符,但不是另一个表,后跟一个id为ContentPlaceHolder1的元素,最后是/ table closed标签。

我写这个reg exp:

~\<table[^>]*>.*?ContentPlaceHolder1.+?<\/table>~is 

在我的文本编辑器(Emeditor)中工作正常,在PHP脚本中,这匹配页面的第一个表标记和后面的代码。

谁能告诉我什么错了? Tks很多

2 个答案:

答案 0 :(得分:1)

我只是假设您希望实现的目标,并且正如Matt对您的问题发表了评论,代码片段以及您正在尝试实现的目标的解释将帮助我们为您提供帮助。

因此,在这种情况下,我会尝试猜测这个问题:
我猜测你的代码在结尾附近有一个id ContentPlaceHolder1 的元素,而且可能没有其他地方。是什么导致我假设你在说:

  

在PHP脚本中,这与页面的第一个表格标记匹配,跟随以下代码。

以及

  

希望匹配一个表格标签,后跟任何字符,但不是另一个表格

虽然情况并非如此。事实上,你的正则表达式正在做以下事情:

  1. 将第一个<table>标记与其中可能包含的任何属性匹配([^>]*
  2. 尽可能少地匹配任何字符(.*?
  3. 匹配ContentPlaceHolder1
  4. 将至少一个字符与任意字符匹配,但尽可能少匹配(.+?
  5. 匹配结束<\/table>代码
  6. 我倾向于认为你误解的是步骤#2 。此步骤尝试实现的目的不是忽略前导<table>标记,而是忽略关键字ContentPlaceHolder1的多次出现。

    请考虑以下示例(请忽略html已损坏,它只是一个示例):

    <table border="3" cellpadding="10" cellspacing="10">
    <td>
    <table border="3" cellpadding="3" cellspacing="3">
               <td>2nd table</td>
                <some_element id="ContentPlaceHolder1"></some_element>
    </table>
               <td>2nd table</td>
               <tr>
               <td>2nd table</td>
               <td>2nd table</td>
               </tr>
               </table>
    <some_element id="ContentPlaceHolder1"></some_element>
    </td>
    <td> the cell next to this one has a smaller table inside of it, a table inside a table.</td>
    </table>
    

    此处,.*?并未指示正则表达式引擎避免匹配第二个<table>标记,而是指示匹配关键字{{的第一次出现1}}而非贪婪匹配最后

    您尝试实现的目标可以通过Negative Lookahead实现。这意味着,它指示正则表达式引擎,进一步远离并确保它不匹配第一个子集,如果存在第二个子集。您可以在此demo实践中看到这一点,我使用否定前瞻指示正则表达式引擎仅匹配ContentPlaceHolder1标记(如果未跟随另一个<table>}标记(<table>

    请查看我的回答,如果确实解决了您的问题,请添加更多信息和代码示例,以便我们提供进一步的帮助。

    此致

答案 1 :(得分:0)

回答问题

这是一个ipotetical页面代码:

<table border="3" cellpadding="10" cellspacing="10">
<tr>
    <td>aaaaa</td>
</tr>
</table>
<table border="3" cellpadding="10" cellspacing="10">
<tr>
    <td>aaaaa</td>
</tr>
</table>
<table border="3" cellpadding="10" cellspacing="10">
<tr>
    <td>
        <!-- from here -->
        <table border="3" cellpadding="3" cellspacing="3">
            <tr>
                <td>aaaa</td>
                <td><a id="ContentPlaceHolder1">link</a></td>
            </tr>
        </table>
        <!-- to here -->
    </td>
</tr>
</table>
<table border="3" cellpadding="10" cellspacing="10">
<tr>
    <td>aaaaa</td>
</tr>
</table>
<table border="3" cellpadding="10" cellspacing="10">
<tr>
    <td>aaaaa</td>
</tr>
</table>

我希望从第一条评论到第二条评论进行匹配。 换句话说,我想将包含elemnt的完整表与ContentPlaceHolder1 id匹配。 我在PHP中的正则表达式匹配第一页表标记。 Tks很多