从字符串中拆分值并将其附加到PHP中该值的末尾

时间:2016-12-11 20:38:56

标签: php html

我不知道这是否可行,因为我无法找到如何做到这一点而且我对PHP很新,但这里是对我的问题的概述:

我有一个读取CSV文件的脚本。其中一列包含包含HTML表的单元格。在所有表中的不同位置,存在一个表行,其中包含<td>Retail</td>,然后是价格,例如<td>$300</td>。下面是一个示例,我已经格式化,以便您更容易阅读,但这通常是从CSV文件中作为连续字符串返回:

<table>
    <tr>
        <td>Designer</td>
        <td>Hermes</td>
    </tr>
    <tr>
        <td>Size inch</td>
        <td>5.9 x 4.3 x 2.4</td>
    </tr>
    <tr>
        <td>Material</td>
        <td>Cotton</td>
    </tr>
    <tr>
        <td>Retail</td>
        <td>$300.00</td>
    </tr>
    <tr>
        <td>Made in</td>
        <td>France</td>
    </tr>
</table>

然后要求这些表格添加CAD [ Canadian Dollars ]零售价。以下是所需最终结果的示例:

<table>
    <tr>
        <td>Designer</td>
        <td>Hermes</td>
    </tr>
    <tr>
        <td>Size inch</td>
        <td>5.9 x 4.3 x 2.4</td>
    </tr>
    <tr>
        <td>Material</td>
        <td>Cotton</td>
    </tr>
    <tr>
        <td>Retail USD</td>
        <td>$300.00</td>
    </tr>
    <tr>
        <td>Retail CAD</td>
        <td>$410.00</td>
    </tr>
    <tr>
        <td>Made in</td>
        <td>France</td>
    </tr>
</table>

我已经看过使用substr(),但看起来你需要指定从字符串开头忽略的字符长度,这对我来说是不可能的,因为数据不同。< / p>

因此,我的问题是,是否可以专门将价格从字符串中拆分出来,然后在</tr>之后将其追加回来,以便结果如上所述。如果你能指出我需要用来实现这个功能的正确方向,那么我真的很感激。请注意,我已使用str_replace()Retail重命名为Retail USD,并且我已经创建了一个变量,可以将美元价格转换为使用金融API的加元价格。

提前感谢您在此提供的任何见解。

3 个答案:

答案 0 :(得分:1)

  

我已经看过使用substr()但看起来好像你需要指定字符串开头会忽略的字符长度,这对我来说是不可能的,因为数据不同。

因此,使用stripos查找要替换的字符串的开头。

然而,我越是深入研究它,因为它很快就会乱成一团。最好编辑CSV生成器,而不是尝试改变CSV。在理想的世界中,您的CSV只包含数据而不是HTML。

  

道歉以下是一个很大的,可能是笨拙的答案:

但是,要执行此操作,您需要将此CSV列隔离为变量$csvData。然后直接使用它:

$csvData = "<table data from your question>";
$csvData = str_replace("</td>","*!*</td>",$csvData);

//remove all the HTML junk
$csvDataClean = strip_tags($csvData);

// Form an array.
$csvDataArray = explode("*!*",$csvDataClean);

// trim contents of the array.
$csvDataArray = array_map('trim', $csvDataArray);

// remove empty array values.
$csvDataArray = array_filter($csvDataArray);

// build new contents array.
foreach($csvDataArray as $key=>$value){
    if($key%2 == 0){
        //odd number. Is a content header.
        $value = str_replace(" ","_",$value);
        $lastHeader = preg_replace("/[^a-z0-9-_]/i","",$value);
    } 
    else {
        //even number, it's a value 
        $csvArray[$lastHeader] = $value;
    }
}
//tidy up. 
unset($key,$value,$lastHeader,$csvDataArray,$csvDataClean);

print_r($csvArray);

现在将为您输出HTML表格中的标题和值数组。然后,您可以轻松地引用此数组中的值,然后将它们重新编译为HTML表格,如nessecary。

使用phpsandbox我可以输出:

Array
(
    [Designer] => Hermes
    [Size_inch] => 5.9 x 4.3 x 2.4
    [Material] => Cotton
    [Retail] => $300.00
    [Made_in] => France
)

因此,您可以使用$csvArray['Retail']并处理此值以获取其他货币值,并将它们添加到此数组中。然后你可以通过另一个进程运行这个数组来重建一个表,保存到CSV中(虽然不建议这样做,最好将arraty保存为CSV本身,但我不知道你的要求)。 / p>

所以:

//whatever system you currently use to get conversion.
$csvArray['Retail_CAD'] = convert_currency($csvArray['Retail']);
$csvArray['Retail_USD'] = convert_currency($csvArray['Retail']);

现在重建HTML表单:

foreach($csvArray as $key=>$value){
    $csvOutput .= "<tr><td>".str_replace("_"," ",$key)."</td><td>".$value."</td></tr>\n";
}
unset($key,$value);
$csvOutput = "<table>".$csvOutput."</table>";

print_r($csvOutput);

如果要将此值保留为最终数组值,也可以手动删除并读取Made_in数组键:

 //whatever system you currently use to get conversion.
$csvArray['Retail_CAD'] = convert_currency($csvArray['Retail']);
$csvArray['Retail_USD'] = convert_currency($csvArray['Retail']);
....
$value = $csvArray['Made_in'];
unset($csvArray['Made_in']);
$csvArray['Made_in'] = $value; 

这是在上面添加新零售列之后保持“制作”列的一种简单但快速的方法。

答案 1 :(得分:0)

你在这里粘贴的是一个html表,而不是csv。

无论如何,有几种方法可以操纵字符串。 str_replace()是最基本的一个,所以你已经有了。在您的情况下,您最好使用正则表达式。它就像str_replace,但功能更强大。那里有很多教程。

如果您想对html或xml数据进行大量更复杂的操作,可能需要查看 XSLT

答案 2 :(得分:0)

我必须处理一次类似的情况,我会做的是:

1.-首先在变量$ output_block中形成所需的输出块,即:

<td>Retail USD</td><td>$300.00</td></tr><tr><td>Retail CAD</td><td>$410.00</td>

注意:你不需要第一个打开tr标签也不需要最后一个关闭,因为你已经在原始输出上有那些。

2.找到<td>Retail</td> 的位置(使用strpos)

3.-将以前的子字符串保存在一个变量中:$ first_part

4.找到<td>Made in</td>

的位置

5.-将变量后面的子字符串保存在变量中:$ last_part

6.-您的最终结果:$final_output = $firstpart . $output_block . $last_part;

简单的蛋糕......;)