帮助PHP简单的html dom - 修改表单

时间:2010-05-01 15:24:36

标签: php forms scrape

我在这里得到了很多帮助,我非常接近解决我的问题,我可以品尝它。但我似乎陷入困境。

我需要从本地网络服务器中抓取一个简单的表单,并且只返回与用户本地电子邮件匹配的行(即onemyndseye @ localhost)。 simplehtmldom可以轻松提取正确的表单元素:

foreach($html->find('form[action*="delete"]') as $form) echo $form;

返回:

<form action="/delete" method="post">
    <input type="checkbox" id="D1" name="D1" /><a href="http://www.linux.com/rss/feeds.php">
        http://www.linux.com/rss/feeds.php
    </a> [email: 
        onemyndseye@localhost (Default)
    ]<br />         
    <input type="checkbox" id="D2" name="D2" /><a href="http://www.ubuntu.com/rss.xml">
        http://www.ubuntu.com/rss.xml
    </a> [email: 
        onemyndseye@localhost (Default)
    ]<br />         
<input type="submit" name="delete_submit" value="Delete Selected" /></form>

但是我在进行下一步时遇到了麻烦。哪个返回包含'onemyndseye @ localhost'的行并将其删除,以便只返回以下内容:

<input type="checkbox" id="D1" name="D1" /><a href="http://www.linux.com/rss/feeds.php">http://www.linux.com/rss/feeds.php</a> <br />
<input type="checkbox" id="D2" name="D2" /><a href="http://www.ubuntu.com/rss.xml">http://www.ubuntu.com/rss.xml</a> <br />

感谢这个网站的精彩用户我已经做到这一点,甚至可以只返回链接,但我无法完成剩下的工作......重要的是完整的<input>标签返回完全如上图所示因为id和name值需要稍后在post数据中传递回原始表单。

提前致谢!

***** EDIT ******

由于Yacoby,问题接近解决了。最后一个小障碍是从str_ireplace留下了一些垃圾。也许删除</a><br />之间的所有文字会更容易??

在Yacoby添加之后,输出如下:

<form action="/delete" method="post">
    <input type="checkbox" id="D1" name="D1" /><a href="http://www.linux.com/rss/feeds.php">
        http://www.linux.com/rss/feeds.php
    </a> [email: 
         (Default)
    ]<br />         
    <input type="checkbox" id="D2" name="D2" /><a href="http://www.ubuntu.com/rss.xml">
        http://www.ubuntu.com/rss.xml
    </a> [email: 
         (Default)
    ]<br />         
    <input type="checkbox" id="D3" name="D3" /><a href="http://mythbuntu.org/rss.xml">
        http://mythbuntu.org/rss.xml
    </a> [email: 

    ]<br />         
<input type="submit" name="delete_submit" value="Delete Selected" /></form>

注意[email :(默认)]和[email:]已被遗忘。还需要删除表单操作并最后提交行,但我认为我可以从之前的建议中收集该部分。

***** SOLVED ****

问题解决了:

$html = file_get_html('http://localhost:9000/');
foreach($html->find('form[action*="delete"]') as $form)
  if ( stripos($form->innertext, 'onemyndseye@localhost') !== false ){
      $form = preg_replace('!</a>.*?<br />!s', '</a><br />', $form);
      echo $form;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

也许像

if ( stripos($form->innertext, 'onemyndseye@localhost') !== false ){
    $form->innertext = str_ireplace('onemyndseye@localhost', '', $form->innertext);
    echo $form;
}

这不适用于像

这样的html
<b>onemyndseye</b>@localhost

因为很容易找到带有标签的文本是否与使用plaintext的字符串匹配,但更换起来要困难得多。