【问题标题】:Extracting data from string从字符串中提取数据
【发布时间】:2026-01-04 16:10:01
【问题描述】:

我有一个包含区域地图和一些其他信息的字符串:

$string = 'something here 
<map name="map">
< area shape="circle" coords="34,210,3" alt="something 1" href="test.php?place=aaa&time=1" />
< area shape="circle" coords="34,220,3" alt="something2" href="test.php?place=bbb&time=2" />
< area shape="circle" coords="669,229,3" alt="some 8" href="test.php?place=bbb&time=3" />
</map>';

如何从字符串中提取每个区域的坐标、地点和时间?

【问题讨论】:

标签: php string extract explode


【解决方案1】:

试试这个,我使用正则表达式将变量提取到数组中。您可以使用 var_dump 查看结果。

$string = 'something here 
<map name="map">
< area shape="circle" coords="34,210,3" alt="something 1" href="test.php?place=aaa&time=1" />
< area shape="circle" coords="34,220,3" alt="something2" href="test.php?place=bbb&time=2" />
< area shape="circle" coords="669,229,3" alt="some 8" href="test.php?place=bbb&time=3" />
</map>';

preg_match_all("/(\d+\,\d+\,\d+)/", $string, $coords);
preg_match_all("/place\=(.*)\&time\=(\d+)/i", $string, $place_time);

var_dump($place_time, $coords);

var_dump() 结果

array (size=3)
  0 => 
    array (size=3)
      0 => string 'place=aaa&time=1' (length=16)
      1 => string 'place=bbb&time=2' (length=16)
      2 => string 'place=bbb&time=3' (length=16)
  1 => 
    array (size=3)
      0 => string 'aaa' (length=3)
      1 => string 'bbb' (length=3)
      2 => string 'bbb' (length=3)
  2 => 
    array (size=3)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '3' (length=1)

array (size=2)
  0 => 
    array (size=3)
      0 => string '34,210,3' (length=8)
      1 => string '34,220,3' (length=8)
      2 => string '669,229,3' (length=9)
  1 => 
    array (size=3)
      0 => string '34,210,3' (length=8)
      1 => string '34,220,3' (length=8)
      2 => string '669,229,3' (length=9)

您可以通过数组/键访问上例中的信息:

echo $coords[1][0]; //return: 34,210,3
echo $place_time[1][0]; //return: aaa
echo $place_time[2][0]; //return: 1

【讨论】:

  • 可以使用parse_urlparse_str解析URL;然后您将能够成功解析test.php?time=1&amp;foo=bar&amp;place=aaa
  • 正则表达式 + XML/HTML ===> 邪恶。这几乎和使用 eval 一样邪恶 -> Read this! ASAP
  • @EliasVanOotegem 很公平,但这里没有匹配 html,只是一些恰好在标签中的任意文本,即使它们丢失仍然可以工作。你的解决方案也很好。土豆土豆。
  • @phpisuber01:我不敢苟同,这不仅仅是一些随意的文本——我想说我们正在处理 XML。 OP 可能会阐明谁在这里有正确的想法
  • @Elias:请停止引用该答案。包含 &lt;&gt; 的字符串不是 HTML 文档。
【解决方案2】:

这对我来说就像标记,你为什么不简单地解析它?

$DOM = new DOMDocument();
$DOM->loadXML($string);
$areas = $DOM->getElementsByTagName('area');
$coordinates = array();
for ($i = 0, $j = count($areas);$i<$j;$i++)
{
    array_push($areas, $areas[$i]->getAttribute('coords'));
}

这就是你应该对待标记的方式,IMO - 当然,除非你是 looking forward to the end of times

See how you can make your life easier when parsing markup,这就是文档的用途。

正如@SalamanA 指出的那样,将片段视为整个 DOM 可能被认为是矫枉过正。值得庆幸的是,有 DOMFragment class 这样的东西可以在这种情况下使用。

$DOMFragment = new DOMDocumentFragment();
$DOMFragment->appendXML($string);
//or, when you need to treat multiple DOMFragments:
$DOM = new DOMDocument();//can be used as a sort-of DOMFragment factory
$fragment = $DOM->createDocumentFragment();
$fragment2 = $DOM->createDocumentFragment();
$fragment->appendXML($string);

【讨论】:

  • 用大炮杀鸟?虽然通常我不赞成使用正则表达式解析 HTML,但使用 DOMDocument 解析 HTML 片段有时是一种矫枉过正。
  • @SalmanA:很公平,我已经编辑了答案以指出 DOMDocumentFragment 对象