文本提取是从非结构化和/或半结构化机器可读文档(文本)中自动提取结构化信息的任务。
从 HTML 文档中提取具有指定类的 <div> 元素及其内容
... PHP中如何匹配里面(包括)的html? 我需要一个可以处理嵌套情况的正则表达式解决方案。 <div class="begin">...</div> 如何在PHP中匹配<div class="begin">里面的html(包括)? 我需要一个可以处理嵌套情况的正则表达式解决方案。 使用 DOM 和 DOMXPath 而不是正则表达式,你会为此感谢我的: // something useful: function dumpDomNode ($node) { $temp = new DOMDocument(); $temp->appendChild($node,true); return $temp->saveHTML(); } $dom = new DOMDocument(); $dom->loadHTML($html_string); $xpath-> new DOMXpath($dom); $elements = $xpath->query("*/div/[@class='begin']"); foreach ($elements as $el) { echo dumpDomNode($el); // <-- or do something more useful with it } 用正则表达式尝试这个将会引导你走向疯狂...... 这个总结得很好。 简而言之,不要使用正则表达式来解析 HTML。相反,请查看 DOM 类,尤其是 DOMDocument::loadHTML 这是你的正则表达式: preg_match('/<div class=\"begin\">.*<\/div>/simU', $string, $matches); 但是: RegEx 不知道 XML/HTML 元素是什么。对他们来说,HTML 只是一个字符串。这就是为什么其他人是对的。正则表达式不适用于解析DOM。它们用于查找字符串模式。 我提供了正则表达式,因为您不打算解析整个 HTML 页面,而只是从中获取一段定义的文本,在这种情况下,可以使用正则表达式。 如果 DIV 内有嵌套 DIV,则正则表达式将无法按预期工作。如果是这种情况,请不要使用正则表达式。使用其他解决方案之一,因为这样你需要 DOM 解析,而不是字符串匹配。 要查找具有或多或少明确定义的开头和结尾的字符串,请考虑使用常规字符串函数,因为它们通常更快。 // Create DOM from URL $html = file_get_html('http://example.org/'); echo $html->find('div.begin', 0)->outertext; http://simplehtmldom.sourceforge.net/manual.htm 这是使用字符串方法的一种方法 $str= <<<A blah <div class="begin"> blah blah blah blah blah </div> blah A; $s = explode("</div>",$str); foreach($s as $k=>$v){ $m=strpos($v,'<div class="begin">'); if($m !==FALSE){ echo substr("$v" ,$m); } } 输出 $ php test.php <div class="begin"> blah blah blah blah blah
从亚马逊搜索结果 HTML 中的合格超链接中抓取 href 值
我一直在尝试构建一个简单的抓取工具,它需要一个关键字,然后去亚马逊并在搜索框中输入关键字,然后仅抓取主要结果。 问题是正则表达式我...
我想从每个播放列表中抓取玩家数量,只是值而不是逗号。 贵族地图包(652 名玩家) 以上是...
如何从 $_SERVER['php_self'] 中找到页面标题的名称? 假设 $_SERVER 显示我的页面如下:/application/mysite/signup.php。 如何选择注册页面标题?
如何使用正则表达式使用 preg_replace 删除给定字符之前的任何内容和给定字符之后的任何内容?当然,这可以通过许多其他方式来完成,例如爆炸和
我有一个像下面这样的字符串: “......地图搜索”),'52.486683,-4.044363',选项......” 我想从字符串中检索 2 个数字(长和纬度) - 我不介意是否
我正在尝试使用 php 脚本从网页中提取产品的价格。有问题的字符串由以下 html 组成: ... 我正在尝试使用 php 脚本从网页中提取产品的价格。有问题的字符串由以下 html 组成: <div class="pd_warranty col-xs-12 no-padding"> <p class="selectWty txtLeft">Available Options</p> <div class="vspace clear"></div> <div class="subProd col-xs-4 noPadLR"> <a href="https://www.example.com/single” class="selected"> <div class="col-xs-12 cellTable pad5All"> <div class="col-xs-8 noPadLR cellTableCell"> <p class="noMar txtLeft">Single</p> <p class="noMar txtLeft sml">$99.99</p> </div> </div> </a> </div> <div class="subProd col-xs-4 noPadLR"> <a href="https://www.example.com/2pack” class=""> <div class="col-xs-12 cellTable pad5All"> <div class="col-xs-8 noPadLR cellTableCell"> <p class="noMar txtLeft">2-PACK</p> <p class="noMar txtLeft sml">$159.99</p> </div> </div> </a> </div> <div class="subProd col-xs-4 noPadLR"> <a href="https://www.example.com/4pack” class=""> <div class="col-xs-12 cellTable pad5All"> <div class="col-xs-8 noPadLR cellTableCell"> <p class="noMar txtLeft">4-PACK</p> <p class="noMar txtLeft sml">$249.99</p> </div> </div> </a> </div> </div> 大多数产品分为三组价格: 单身的 2 件装 4 件装 某些页面可能没有 2-PACK 或 4-PACK 之一或两者。 我未能尝试编写正则表达式来从具有上述字符串的变量中提取我需要的信息。我正在尝试制作一个 php 正则表达式来提取数组 [type][price] 中的单词 single/2-pack/4-pack 和价格,以表示每种类型是否存在于带有价格的 html 中。 有很多方法可以自定义 xpath 和迭代节点处理,但这确实适用于您的示例字符串。 您可以根据您的需要改进此解决方案,使其或多或少严格。 (Jakub 强迫我发布这个答案,因为我不希望你不得不求助于正则表达式。) 代码:(演示) $dom = new DOMDocument; $dom->loadHTML(str_replace ('”', '"', $html)); // normalize the quoting; extend as needed $xpath = new DOMXPath($dom); // actually targeting this div ---------vvv foreach ($xpath->evaluate("//div[contains(@class, 'subProd')]//div[contains(p/@class, 'noMar')]") as $div) { $type = $xpath->query("p[contains(@class, 'noMar') and not(contains(@class, 'sml'))]", $div)[0]->nodeValue; $price = $xpath->query("p[contains(@class, 'noMar') and contains(@class, 'sml')]", $div)[0]->nodeValue; $result[$type] = $price; } var_export($result); 输出: array ( 'Single' => '$99.99', '2-PACK' => '$159.99', '4-PACK' => '$249.99', ) 解释一下... foreach() 的输入针对的是具有一个或多个子级的 div 具有类属性 noMar。 对于 html 中找到的每个合格 div... 从 type 元素中提取的 p 文本,其类具有 noMar 但不具有 sml price 文本(如果从具有 p 和 noMar 的类的 sml 元素中提取) 我将提取的数据存储为一维关联数组。 请注意,使用正则表达式解析 html 很脆弱,并且大多数情况下会破坏 html 更改。您需要不断在匹配过于具体和过于开放之间做出妥协。 这是: $pattern = '#<div class="subProd.*?<p class="noMar[^>]+>(?P<product>[^<]+).*?<p class="noMar[^>]+>(?P<price>[^<]+)<#smi'; if (preg_match_all($pattern, $html, $matches)) { $products = array_combine($matches['product'], $matches['price']); var_dump($products); } 将倾倒: array(3) { ["Single"]=> string(6) "$99.99" ["2-PACK"]=> string(7) "$159.99" ["4-PACK"]=> string(7) "$249.99" } 模式解释: # 是模式分隔符。 <div class="subProd 将按字面意思匹配字符串。 .*? 将匹配任何字符任意次数,但不会贪婪。这意味着它将匹配最短的字符串,直到模式的下一个匹配部分。 <p class="noMar 将按字面意思匹配字符串。 [^>]+> 是一个字符组。它将匹配除 > 之外的任何字符至少一次,直到找到 >。 (?P<product>[^<]+) 是一个命名的捕获组(在 () 内)。这使得您的匹配稍后可以在 product 中的 $matches 键下使用。它将匹配任何字符,但 < 至少一次。 .*?任何不贪婪的角色。 <p class="noMar 文字字符串。 [^>]+> 任何字符,除了 > 直到 > (?P<price>[^<]+)< 除 < 直至 < 之外的任何字符。直到<的部分将被捕获到price组中。
我有一个巨大的字符串,我需要从中提取信息。其中有些部分有所不同,有些则没有。我面临的困难是我找不到符号或可以得到我的东西...
将 .txt 文件中的两连续行替换为表示合并范围和求和值的单行
我有一个名为“test.txt”的文件,其中包含以下内容: BEGIN_SESSION 7 1小时+47 3000万-1小时20 1500万-3000万 16 500万-1500万 43 200万-500万 29 30秒-200万 35 0秒-30秒 170 END_SESSION 我需要
我有一个名为“test.txt”的文件,其中包含以下内容: BEGIN_SESSION 7 1小时+47 3000万-1小时20 1500万-3000万 16 500万-1500万 43 200万-500万 29 30秒-200万 35 0秒-30秒 170 END_SESSION 感谢用户...
从 .txt 文件中的限定行获取日期时间值,然后重新格式化日期时间值
我有一个名为“test.txt”的文件,其中包含以下内容: BEGIN_GENERAL 8 最后一行 20130801000028 136606 57288915 25883895742573 第一次 20130701130426 最后时间 20130731235941
我有一个名为“test.txt”的文件,其中包含以下内容: BEGIN_SESSION 7 1小时+47 3000万-1小时20 1500万-3000万 16 500万-1500万 43 200万-500万 29 30秒-200万 35 0秒-30秒 170 END_SESSION 我想要一个
我有一个名为“test.txt”的文件,其中包含以下内容: BEGIN_SESSION 7 1小时+47 3000万-1小时20 1500万-3000万 16 500万-1500万 43 200万-500万 29 30秒-200万 35 0秒-30秒 170 END_SESSION 我想要一个有趣的...
我知道这个主题已经在某种程度上被涵盖了,但几天后我仍然无法找出从文本块中解析价格的最佳方法。 以下是一些示例: 这辆车...
我正在尝试清理 API 响应中包含电视频道信息的文本。 BBC1(现在:BBC 新闻 下一个:BBC 新闻)) 我只想要 BBC1;之后就什么都没有了。 我试过这个: $名称 =
从可能包含无效 HTML 的字符串中提取 <img> src 值
我在 PHP 中有一个如下所示的变量。 $content = 'abc def end'; 我必须使用正则表达式删除除 img 标签的 src 之外的所有内容
我有网址http://example.com/script.php?l=7&p=146#p146。我希望能够获得 p= 之后的数字,而不需要 #。另外,哈希值可能并不总是存在,所以有时它可能会变成
从 HTML 字符串中的所有超链接获取 href 值[重复]
我有多个包含链接的字符串,例如: 测试2 布拉布拉 我有多个包含链接的字符串,例如: <A HREF="http://www.testings2">testings2</A> <A HREF="http://www.blabla">blabla</A> <A HREF="http://www.gowick">gowick</A> 我想使用正则表达式模式来获取 href 属性声明中的 URI。 我可以这样做: /".*?"/ 但是“”就会出现。有没有一种方法可以在不使用 preg_replace() 函数的情况下获取 HREF="" 中的 URI? preg_match_all('/href="([^"]+)/i', $str, $matches); var_dump($matches); 不确定如何在 PhP 中应用它,但它可以在 perl 中使用 /<a href="([^"]+)".+/i; 我认为是这样 preg_match( '/<a href="([^"]+)".+/i;', $str, $matches); $str=<<<EOF <A href="http:// www.testings2">testings2</A> blah <A HrEF= "http://www.blabla">blabla</A> blah <A HREF="http://www.gowick">gowick</A> <A HREF="http://www.testing3">testing3</A> <a class="navigation" id="selected" href="http://somewhere.com"><xsl:value-of select="title" /></a> EOF; $s = preg_split("/<\/A>/i",$str); $s = preg_replace("/\n+/","",$s); $uris = preg_grep("/HREF/i",$s); foreach($uris as $v){ $fin = explode('">',$v); $t=preg_split('/href="/i',$fin[0] ); print end($t)."\n"; } 输出 # php test.php http://www.testings2 http://www.blabla http://www.gowick http://www.testing3 http://somewhere.com
我想捕获没有年份的路径中的最后一个文件夹。对于这个字符串路径,我只需要 Millers Crossing 而不是 Movies\Millers Crossing,这是我当前的正则表达式捕获的内容。 G:\莫...