我有一组从谷歌草图导出的坐标,有额外的绒毛,我一直试图剥离正则表达式。我认为从3D中快速获取3D图纸非常有趣。 SketchUp进入canvas和.xsi文件。在一个变量中有多个数据集实例:
$str = 'SI_NurbsCurve Edge1 { 1, 0, 0, 4, 0,0,1,1, 2, 870.243,1229.35,143.395,1 927.537,1323.53,103.842,1 } SI_NurbsCurve Edge2 { 1, 0, 0, 4, 0,0,1,1, 2, 899.54,1217.88,116.255,1 870.243,1229.35,143.395,1 }';
我试图删除多个实例中的所有内容,除了使用此正则表达式的坐标数据:
$reg = '#SI_NurbsCurve Edge[^"]* { 1, 0, 0, 4, 0,0,1,1, 2,#'; $rep=""; $str=preg_replace($reg,$rep,$str);
但是,这个结果只回显了字符串中找到的最后一个坐标集,在这个例子中仍然存在以下内容:
899.54,1217.88,116.255,1 870.243,1229.35,143.395,1
除此之外,我试图去除每行坐标上出现的最后一个数字“1”,所以整个示例最终看起来像这样:
870.243,1229.35,143.395, 927.537,1323.53,103.842, 899.54,1217.88,116.255, 870.243,1229.35,143.395,
我非常感谢您的时间和技术诀窍!
答案 0 :(得分:0)
我认为你正在寻找$ str = substr($ str,0,-1)
答案 1 :(得分:0)
您的第一个问题(仅获取最后一个值)可能是由此引起的:
#SI_NurbsCurve Edge[^"]*
你需要一个非贪婪的正则表达式,或者Edge
之后的值只是数字:
#SI_NurbsCurve Edge[0-9]*
之后,你可以砍掉剩下的每一行的最后两个字符。
您可能还需要转义{
字符:\{
并在每个集后面考虑}
和空格/换行符,所以第一行应该是这样的:
$str = '#(\}\s+)?SI_NurbsCurve Edge[0-9]* \{
请参阅Codepad上的工作示例(除了每行的最后2个字符...)。
要删除每行末尾的剩余,1
,您可以更改preg_replace
行:
$str=preg_replace(array($reg, '#,1\r#'),array($rep,"\r"),$str);
这至少适用于Codepad,但可能取决于换行符的编码。
答案 2 :(得分:0)
无论如何,这不是一个完美的解决方案,但是,通过可用的测试数据,以下内容将返回所需的输出:
$str = 'SI_NurbsCurve Edge1 {
1,
0,
0,
4,
0,0,1,1,
2,
870.243,1229.35,143.395,1
927.537,1323.53,103.842,1
}
SI_NurbsCurve Edge2 {
1,
0,
0,
4,
0,0,1,1,
2,
899.54,1217.88,116.255,1
870.243,1229.35,143.395,1
}';
function stripExtra( $inElem ){
return !preg_match( '/^(?:(?:[0124](?:,0,1,1)?\,)|(?:\})|(?:SI_NurbsCurve Edge.+ \{))$/' , $inElem );
}
$arr2 = array_filter( array_map( 'trim' , explode( "\n" , preg_replace( "/\,1\s+\n/" , ",\n" , $str ) ) ) , 'stripExtra' );
var_dump( $arr2 );
# Returns
# array(5) {
# [7]=>
# string(25) "870.243,1229.35,143.395,"
# [8]=>
# string(25) "927.537,1323.53,103.842,"
# [10]=>
# string(0) ""
# [18]=>
# string(24) "899.54,1217.88,116.255,"
# [19]=>
# string(25) "870.243,1229.35,143.395,"
# }
完成解决方案......
function stripExtra( $inElem ){
return !preg_match( '/^(?:(?:[0124](?:,0,1,1)?\,)|(?:\})|(?:SI_NurbsCurve Edge.+ \{))$/' , $inElem );
}
此功能将匹配呈现的字符串。根据提供的字符串是否与特定模式匹配,它将返回true或false。这将允许我们在以后删除不需要的行。此处使用的模式将匹配以下行:
SI_NurbsCurve Edge1 {
0,
1,
2,
4,
0,0,1,1,
}
注意:只有在没有前缀为一个或多个空格的情况下才会匹配这些行。但是,由于你的最终输出已经剥离了所有空间,所以这并不重要。
所以,为了便于阅读,我将把我的一行奇迹转移到多行,这样我就能更好地解释它。
$arr2 = preg_replace( "/1\s+\n/" , "\n" , $str );
这将根据请求替换行末尾的“,1”的任何实例。
$arr2 = explode( "\n" , $arr2 );
这会根据换行符分割字符串,创建一个数组,每行形成一个新元素。
$arr2 = array_map( 'trim' , $arr2 );
这使用array_map()
函数(PHP Documentation)将trim()
函数(PHP Documentation)应用于每个函数,从每个函数中删除任何前导和/或尾随空格元件。
$arr2 = array_filter( $arr2 , 'stripExtra' );
还记得我们上面写的那个功能吗?现在我们遍历数组,并测试每个元素。如果它们与上面提到的行不匹配,那么它们将保留在数组中。如果它们匹配上述不需要的行,那么该元素将从数组中删除。