preg_replace('~^"?(.*?)"?$~', '$1', $string); // double quotes
preg_replace('~^[\'"]?(.*?)[\'"]?$~', '$1', $string); // either ' or " whichever is found
/**
* 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
'"'"@";'"*&^*'' => "'"@";'"*&^*'
$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);
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
'"'"@";'"*&^*'' => "'"@";'"*&^*'
//$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);
8条答案
按热度按时间rvpgvaaj1#
字面上的答案应该是
它将删除字符串中所有的前导引号和尾随引号。
如果您需要严格删除第一个引号和最后一个引号(以防它们存在),则可以使用如下正则表达式
如果仅在前导引号和尾随引号严格成对时才需要删除,则使用Steve Chambers' answer中的函数
但是,如果您的目标是从CSV文件中读取值,那么fgetcsv是唯一正确的选项,它将处理所有的边缘情况,同时剥离值封装。
yh2wf1be2#
我也有类似的需求,所以写了一个函数,可以从字符串中删除前导和尾随的单引号或双引号:
这将产生下列输出:
Regex演示(显示匹配/捕获的内容):https://regex101.com/r/3otW7H/8
hujrc8aj3#
trim
将删除字符的所有示例,如果它与您提供的模式匹配,那么:将成为:
下面是一种只删除匹配的第一个和最后一个字符的方法:
mccptt674#
虽然这个帖子早就应该被删除了,但我还是忍不住给出了一个我称之为最简单的答案。我注意到这个帖子在17号重新出现,所以我并不觉得很糟糕。
使用Steve Chambers提供的样品;
输出如下;
这只会删除第一个和最后一个引号,它不会重复删除额外的内容,也不关心匹配的结尾。
xxslljrj5#
这是一个老帖子,但仅仅为了迎合多字节字符串,至少有两种可能的途径可以遵循。我假设引号剥离是因为引号被认为是一个程序/ INI变量,因此要么是“something”或“somethingelse”,但不是“混合引号”。此外,匹配引号之间的任何内容都将保持不变。
途径1 -使用正则表达式
它使用\1来匹配与开头匹配的相同类型的引号。u修饰符使它支持UTF8(好吧,不完全支持多字节)
路由2 -使用mb_* 函数
hgc7kmma6#
你需要使用正则表达式,看看:-
http://php.net/manual/en/function.preg-replace.php
或者,在本例中,可以使用substr检查字符串的第一个字符和最后一个字符是否为引号,如果是,则截断字符串。
http://php.net/manual/en/function.substr.php
bfnvny8b7#
regex怎么样
产出
3duebb1j8#
如果您喜欢性能胜过清晰度,请选择以下方法:
注解有助于澄清......在字符串上使用类似数组的括号是可能的,并且比等效的方法需要更少的处理工作,可惜没有长度变量或最后一个字符索引