如何从字符串中提取数字并添加到数组?

我想转换此字符串:</ p>

 &lt; 5&gt;  ;  20825.24&lt; / 5&gt;  &LT; 7个 0.07&lt; 7&gt;  &LT; 8是氢。  0.0&lt; / 8&gt; 
</ code> </ pre>

到具有键值的数组</ p>

我真的很感激帮助</ p>

我尝试了不同的xmlParse策略,但它并不完全是xml。</ p>

  $ xml = new \ SimpleXMLElement(“&lt; 5&gt; 20825.24&lt; /  5&gt;&lt; 7&gt;&lt; 7&gt;&lt;&gt;&lt;&gt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;  XML </ p> 

我期待这样的数组:</ p>

  [5 =&gt; 20825.24,7 =&gt; 0.0,8 =&gt;  0.0] 
</ code> </ pre>
</ div>

展开原文

原文

I want to convert this string:

<5> 20825.24 </ 5> <7> 0.0 </ 7> <8> 0.0 </ 8>

to an array with key value

I would really appreciate the help

I tried different xmlParse strategies but it is not exactly an xml.

$xml = new \SimpleXMLElement("<5>20825.24</5><7>0.0</ 7><8>0.0</8>");

Response: String could not be parsed as XML

I expect an array like this:

[5=>20825.24,7=>0.0,8=>0.0]

douhuiyan2772
douhuiyan2772 这是STag(开始标记)的规范。
一年多之前 回复
duankuangxie9070
duankuangxie9070 XML标记名称不能以数字开头,因此这意味着除非您处理数据-它不是有效的XML(也没有根节点-但很容易修复)
一年多之前 回复

4个回答



 &lt;?php 

$ subject ='&lt; 5&gt; 20825.24&lt; 7&gt; 0.08。 0.0';
$ pattern ='/&lt;(\ d)\\; \ s +(\ d+ \。\ dd +)/ u';
n $ result = preg_match_all($ pattern,$ subject,$ output) ;

$ numbers = $ output [1];
$ output = $ output [2];
$ outTotal = [];

foreach($ numbers as $ key =&gt; $ number){

$ outTotal [$ number] = $ output [$ key];
}
var_dump($ outTotal);
</ code> </ pre>

给出:</ p> \ n

  array(3){
[5] =&gt;
string(8)“20825.24”
[7] =&gt;
string(3)“0.0”
[8] =&gt;
string(3)“0.0”
}
</ code> </ pre>
</ div>

展开原文

原文

<?php

$subject = '<5> 20825.24 <7> 0.0 <8> 0.0';
$pattern = '/\<(\d)\>\s+(\d+\.\d+)/u';
$result = preg_match_all($pattern,$subject,$output);

$numbers = $output[1];
$output = $output[2];
$outTotal = [];

foreach ($numbers as $key => $number) {
    $outTotal[$number] = $output[$key];
}
var_dump($outTotal);

gives:

array(3) {
  [5]=>
  string(8) "20825.24"
  [7]=>
  string(3) "0.0"
  [8]=>
  string(3) "0.0"
}



在这里,我们还可以使用正则表达式并收集我们想要的数字,然后将其推送到新数组:</ p> \ ñ

 <代码>(:其中?)(\ d):(??:+)?(?&GT)([0-9] +)
</代码> < / pre>

此表达式也可能适用于嵌套元素。 </ p>

测试</ h3>

  $ re ='/(?:&lt;)(\ d?)(?:&gt;)(?  :。+?)([0-9。] +)?/ m'; 
$ str ='&lt; 5&gt; 20825.24&lt; / 5&gt; &LT; 7个 0.07&lt; 7&gt; &LT; 8是氢。 0.0&lt; / 8&gt;';
preg_match_all($ re,$ str,$ matches,PREG_SET_ORDER,0);

$ arr = array();
foreach($ match as $ key =&gt; $ value) {
$ arr [$ value [1]] = $ value [2];
}

var_dump($ arr);
</ code> </ pre>

输出< / h3>

  array(3){
[5] =&gt;
string(8)“20825.24”
[7] =&gt;
string(3)“ 0.0“
[8] =&gt;
string(3)”0.0“
}
</ code> </ pre>

DEMO </ h3>

RegEx电路</ h3>

jex.im 可视化正则表达式:< / p>

</ p>
</ div>

展开原文

原文

Here, we can also use a regular expression and collect our desired numbers, then push it to a new array:

(?:<)(\d?)(?:>)(?:.+?)([0-9.]+)?

This expression might also work with nested elements.

Test

$re = '/(?:<)(\d?)(?:>)(?:.+?)([0-9.]+)?/m';
$str = '<5> 20825.24 </ 5> <7> 0.0 </ 7> <8> 0.0 </ 8>';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

$arr = array();
foreach ($matches as $key => $value) {
    $arr[$value[1]] = $value[2];
}

var_dump($arr);

Output

array(3) {
  [5]=>
  string(8) "20825.24"
  [7]=>
  string(3) "0.0"
  [8]=>
  string(3) "0.0"
}

DEMO

RegEx Circuit

jex.im visualizes regular expressions:

enter image description here



只要您的输出在XML标记名称的开头有数字,它就不是有效的XML。 您可能不得不求助于使用正则表达式来完成这项工作。</ p>

这使用&lt;(\ d )&gt;(。?)&lt; /〜</ 代码>查找&lt; </ code>后跟数字,然后&gt; </ code>并捕获所有内容,直到下一个&lt; / </ code>。 然后它组合来自捕获组1(标记名称)和2(值)的值...... </ p>

  $ data =“&lt; 5&gt; 20825.24&lt; / 5&gt;  ;&lt; 7&gt; 0.0&lt; 7&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt;&gt;&lt; /&gt;&n;&lt; /&gt;&n;&lt; /&gt;  $ data,$ matches); 
$ output = array_combine($ matches [1],$ matches [2]);
print_r($ output);
</ code> </ pre>

给... </ p>

 数组

[5] =&gt; 20825.24
[7] =&gt; 0.0
[8] =&gt; 0.0


</ code> </ pre>
</ div>

展开原文

原文

As long as your output has numbers at the start of the XML tag name, it won't be valid XML. You may have to resort to using a regex to do the job.

This uses <(\d*)>(.*?)</~ which looks for a < followed by digits, then the > and captures everything up till the next </. It then combines the values from capture group 1 (the tag name) and 2 (the value)...

$data = "<5>20825.24</5><7>0.0</ 7><8>0.0</8>";

preg_match_all("~<(\d*)>(.*?)</~", $data, $matches);
$output = array_combine($matches[1], $matches[2]);
print_r($output);

gives...

Array
(
    [5] => 20825.24
    [7] => 0.0
    [8] => 0.0
)

dp152153
dp152153 谢谢,这是一个正确的方法
一年多之前 回复
douhai9043
douhai9043 这简洁,比我的更干净。
一年多之前 回复



如果要将开始标记中的数字与结束标记中的数字相匹配,可以使用正则表达式使用 反向引用到第一个捕获组:</ p>

  <代码>≤(\ d +)&GT; \ H * \ d +(?:\。\ d +)?\ H *&LT; / \ H * \ 1&GT; 
</代码> </ PRE>
\ n

解释</ strong> </ p>


  • &lt; </ code>匹配&gt; </ code> char </ li>
  • (\ d +)&gt; </ code>在第1组中捕获1+位数并匹配&gt; </ code> </ li>
  • \ h * </ code>匹配0+水平空白字符</ li>
  • \ d +(?:\。\ d +)?</ code>匹配1+位后跟可选部分 匹配点和1+位数</ li>
  • \ h * </ code>匹配0+水平空白字符</ li>
  • &lt; </ code >匹配&lt; </ code> </ li>
  • / \ h * </ code>匹配 \ </ code>后跟0+水平空白字符</ li >
  • \ 1&gt; </ code> Mat 使用 \ 1 </ code>对组1进行反向引用并匹配&gt; </ code> </ li>
    </ ul>

    正则表达式演示 | Php演示 </ p>

    例如:</ p>

      $ re ='〜&lt;(\ d +)&gt; \ h *(\ d +(?:\。\ d +)?)\ h *&lt; / \ h * \ 1&gt; ~m'  ; 
    $ str ='&lt; 5&gt; 20825.24&lt; / 5&gt; &LT; 7个 0.07&lt; 7&gt; &LT; 8是氢。 0.0&lt; / 8&gt;';
    preg_match_all($ re,$ str,$ matches);
    print_r(array_combine($ matches [1],$ matches [2]));
    </ code> </ pre>

    结果</ p>

      Array 

    [5] =&gt; 20825.24
    [7] =&gt; 0.0
    [8] = &gt; 0.0

    </ code> </ pre>

    请注意,现在数组键是5,7和8.请记住,如果您可能使用不同的数据,那么数组可以 没有重复的密钥。</ p>
    </ div>

展开原文

原文

If you want to match the digits in the opening tag with the digits in the closing tag, you could use a regex make use of a backreference to the first capturing group:

<(\d+)>\h*\d+(?:\.\d+)?\h*</\h*\1>

Explanation

  • < Match > char
  • (\d+)> Capture in group 1 matching 1+ digits and match >
  • \h* Match 0+ horizontal whitespace chars
  • \d+(?:\.\d+)? Match 1+ digits followed by an optional part to match a dot and 1+ digits
  • \h* Match 0+ horizontal whitespace chars
  • < Match <
  • /\h* Match \ followed by 0+ horizontal whitespace chars
  • \1> Match backreference to group 1 using \1 and match >

Regex demo | Php demo

For example:

$re = '~<(\d+)>\h*(\d+(?:\.\d+)?)\h*</\h*\1>~m';
$str = '<5> 20825.24 </ 5> <7> 0.0 </ 7> <8> 0.0 </ 8>';
preg_match_all($re, $str, $matches);
print_r(array_combine($matches[1], $matches[2]));

Result

Array
(
    [5] => 20825.24
    [7] => 0.0
    [8] => 0.0
)

Note that now the array keys are 5, 7 and 8. Keep in mind that if you might use different data, that arrays can not have duplicate keys.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐