我不知道这是否可行,因为我无法找到如何做到这一点而且我对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的加元价格。
提前感谢您在此提供的任何见解。
答案 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;
简单的蛋糕......;)