在PHP中删除字符串开头和结尾的引号

在PHP中删除字符串开头和结尾的引号,php,string,Php,String,我有这样的字符串: “我的价值1”=>我的价值1 “我的价值2”=>我的价值2 myvalue3=>myvalue3 我需要在结束和开始时去掉“(双引号),如果存在,但如果字符串中有此类字符,则应将其保留在那里。例如: 我的“值1”=>我的“值1” 如何在PHP中实现这一点?是否有用于此的函数,或者我必须自己编写它?您需要使用正则表达式,请查看:- 或者,在本例中,可以使用substr检查字符串的第一个和最后一个字符是否是引号,如果是,则截断字符串 字面上的答案是 trim($string

我有这样的字符串:

“我的价值1”=>我的价值1
“我的价值2”=>我的价值2
myvalue3=>myvalue3
我需要在结束和开始时去掉
(双引号),如果存在,但如果字符串中有此类字符,则应将其保留在那里。例如:

我的“值1”=>我的“值1”

如何在PHP中实现这一点?是否有用于此的函数,或者我必须自己编写它?

您需要使用正则表达式,请查看:-

或者,在本例中,可以使用substr检查字符串的第一个和最后一个字符是否是引号,如果是,则截断字符串


字面上的答案是

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
如果仅在前导引号和尾随引号严格成对的情况下才需要删除,请使用中的函数


但是,如果您的目标是从CSV文件中读取值,则这是唯一正确的选项。它将处理所有边缘情况,同时剥离值外壳。

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);
正则表达式呢

//$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 the first and last quote from a quoted string of text
 *
 * @param mixed $text
 */
function stripQuotes($text) {
  return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
} 
这将产生下列输出:

输入文本输出文本
--------------------------------
无引号=>无引号
“双引号”=>双引号
“单引号”=>单引号
“各一个”=>“各一个”
“多个”“引号”=>多个”“引号
'"'"@";'"*&^*'' => "'"@";'"*&^*'

Regex演示(显示匹配/捕获的内容):

尽管这个线程早就应该被杀死,但我还是忍不住给出了我称之为最简单的答案。我注意到这个线程在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
'"'"@";'"*&^*'' => "'"@";'"*&^*'

这只会删除第一个和最后一个引号,不会重复删除额外内容,也不关心匹配的结尾。

如果您喜欢性能而不是清晰度,这是一种方式:

// 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);
该评论有助于澄清。。。
在字符串上使用类似数组的括号是可能的,并且需要的处理工作量比等效方法少,可惜没有长度变量或最后一个字符索引这是一篇老文章,但为了适应多字节字符串,至少可以遵循两种可能的路线。我假设正在进行引号剥离因为引号被视为程序/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;
}

功能确实很好,但OP希望保留“在中间,只在开始和结束时删除…如果第二个字符也是'”,或者倒数第二个字符,那么也将被删除。如果这些都是重要的,那么修剪下降。这稍微取决于实际数据。请参阅用户783322的答案。用简单的话说:“trim()将从开始或结束删除连续的引号。但是,我们只想删除第一个引号和最后一个引号。也就是说,这不应该是一个可接受的答案。这似乎是我需要的,但不是我问的。这不应该是可接受的答案。如果引号是字符串的一部分怎么办?
“这是双引号->”
将输出
这是双引号->
,这意味着您错过了字符串的一个完整部分。您肯定不需要正则表达式。Trim可能会删除字符串开头或结尾的重要引号-我支持regexps!简单地说:“trim()将从开始或结束处删除连续的引号。但是,我们只想删除第一个引号和最后一个引号。如果出现
“Hello”World”“
?“Hello”World”“=>“Hello”World”,当我看到所有复杂的正则表达式时,我不确定是否遗漏了什么。。但是
preg_replace('/(^“|“$)/”,'',''“Hello”World”“)
返回
“Hello”World”
。甚至是
“/^”|“$/”
作为模式也可以使用。我意识到OP没有询问多字节字符串,但这对此类字符串不起作用。人们不必使用正则表达式,但它们确实让这变得相当简单。我没有在模式的开头、结尾和I修饰符。回答这个问题所需的^(\'\'”)(.*)\1$su不是全部吗?