[英]PHP - Regular Expression to Remove Single Quotes From Beginning and End of a String
[英]Remove quotes from start and end of string in PHP
我有这样的字符串:
"my value1" => my value1
"my Value2" => my Value2
myvalue3 => myvalue3
我需要去掉"
(双引号) 最后并开始,如果这些存在,但如果 String 中有这种字符,那么它应该留在那里。例如:
"my " value1" => my " value1
我如何在 PHP 中执行此操作 - 是否有此功能或我必须自己编写代码?
字面的答案是
trim($string,'"'); // double quotes
trim($string,'\'"'); // any combination of ' and "
它将从字符串中删除所有前导和尾随引号。
如果您需要严格删除第一个和最后一个引号以防它们存在,那么它可能是这样的正则表达式
preg_replace('~^"?(.*?)"?$~', '$1', $string); // double quotes
preg_replace('~^[\'"]?(.*?)[\'"]?$~', '$1', $string); // either ' or " whichever is found
如果仅在前导和尾随引号严格配对的情况下才需要删除,请使用Steve Chambers 的答案中的函数
但是,如果您的目标是从 CSV 文件中读取值,则fgetcsv是唯一正确的选项。 它将处理所有边缘情况,同时剥离价值外壳。
我有一个类似的需求,并编写了一个函数来从字符串中删除前导和尾随单引号或双引号:
/**
* Remove the first and last quote from a quoted string of text
*
* @param mixed $text
*/
function stripQuotes($text) {
return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
}
这将产生下面列出的输出:
Input text Output text
--------------------------------
No quotes => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each' => "One of each'
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'
正则表达式演示(显示正在匹配/捕获的内容): https : //regex101.com/r/3otW7H/1
如果匹配您提供的模式, trim
将从开头和结尾删除字符的所有实例,因此:
$myValue => '"Hi"""""';
$myValue=trim($myValue, '"');
会变成:
$myValue => 'Hi'.
这是一种仅删除匹配的第一个和最后一个字符的方法:
$output=stripslashes(trim($myValue));
// if the first char is a " then remove it
if(strpos($output,'"')===0)$output=substr($output,1,(strlen($output)-1));
// if the last char is a " then remove it
if(strripos($output,'"')===(strlen($output)-1))$output=substr($output,0,-1);
尽管这个线程早就应该被杀死,但我忍不住用我称之为最简单的答案来回应。 我注意到这个线程在 17 日重新出现,所以我对此并没有那么糟糕。 :)
使用 Steve Chambers 提供的样本;
echo preg_replace('/(^[\"\']|[\"\']$)/', '', $input);
输出如下;
Input text Output text
--------------------------------
No quotes => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each' => One of each
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'
这只会删除第一个和最后一个引号,它不会重复删除额外的内容,也不关心匹配的结尾。
这是一篇旧帖子,但为了迎合多字节字符串,至少有两种可能的路线可以遵循。 我假设正在执行引号剥离,因为引号被视为程序/INI 变量,因此是“某物”或“某物”但不是“混合引号”。此外,匹配引号之间的任何内容都是完好无损。
路线 1 - 使用正则表达式
function sq_re($i) {
return preg_replace( '#^(\'|")(.*)\1$#isu', '$2', $i );
}
这使用 \\1 来匹配与开头匹配的相同类型的引号。 u 修饰符,使其支持 UTF8(好吧,不完全支持多字节)
路线 2 - 使用 mb_* 函数
function sq($i) {
$f = mb_substr($i, 0, 1);
$l = mb_substr($i, -1);
if (($f == $l) && (($f == '"') || ($f == '\'')) ) $i = mb_substr($i, 1, mb_strlen( $i ) - 2);
return $i;
}
你需要使用正则表达式,看看:-
http://php.net/manual/en/function.preg-replace.php
或者,在这种情况下,您可以使用 substr 检查字符串的第一个字符和最后一个字符是否是引号,如果是,则截断字符串。
正则表达式怎么样
//$singleQuotedString="'Hello this 'someword' and \"somewrod\" stas's SO";
//$singleQuotedString="Hello this 'someword' and \"somewrod\" stas's SO'";
$singleQuotedString="'Hello this 'someword' and \"somewrod\" stas's SO'";
$quotesFreeString=preg_replace('/^\'?(.*?(?=\'?$))\'?$/','$1' ,$singleQuotedString);
输出
Hello this 'someword' and "somewrod" stas's SO
如果您更喜欢性能而不是清晰度,则可以这样做:
// Remove double quotes at beginning and/or end of output
$len=strlen($output);
if($output[0]==='"') $iniidx=1; else $iniidx=0;
if($output[$len-1]==='"') $endidx=-1; else $endidx=$len-1;
if($iniidx==1 || $endidx==-1) $output=substr($output,$iniidx,$endidx);
注释有助于清晰......在字符串上类似数组的用法中的括号是可能的,并且比等效方法需要更少的处理工作,太糟糕了没有长度变量或最后一个字符索引
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.