我正在慢慢改进PHP中的标点修复功能,用于清理用户输入。该函数当前在标点符号后添加空格,在标点符号之前删除空格,并将每个句子的第一个单词大写。我见过一些人正在寻找类似的功能,所以我很乐意分享到目前为止我所拥有的功能。它非常接近我想要它的位置,但是,当它在逗号后添加一个空格时,它应该避免这样做,当逗号在一个数字内,例如1,000时,任何人都可以建议最快的方法来修改我的代码以忽略数字中的逗号?也许有办法缩短我所拥有但仍然达到相同的结果?谢谢你的时间......
function format_punc($string){
$punctuation = ',.;:';
$string = str_replace(' ?', '?', str_replace(' .', '.', str_replace(' ,', ',', preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $string))));
$string = trim(preg_replace('/[[:space:]]+/', ' ', preg_replace('/([\.!\?]\s+|\A)(\w)/e', '"$1" . strtoupper("$2")', $string)));
if($string[strlen($string)-1]==','){
$string = substr($string, 0, -1).'.';
}
return $string;
}
答案 0 :(得分:5)
这是我更新的php修复标点符号功能...它现在似乎正常工作。我确信有一些方法可以压缩它,但它可以对字符串进行以下操作...
减少重复的标点符号,如!!至 !
将多个空间减少到单个空格
之前删除任何空格? 。 ,
之后添加空格; :
在逗号后添加空格,但在它们是数字的一部分时不添加
在句点之后添加空格,但不是在它们是数字或缩写的一部分时添加
从字符串的开头和结尾删除空格
大写句子的第一个词
如果是逗号,则将最后一个字符更改为句点
function format_punc($string){
$punctuation = ';:';
$spaced_punc = array(' ?', ' .', ' ,');
$un_spaced_punc = array('?', '.', ',');
$string = preg_replace("/([.,!?;:])+/iS","$1",$string);
$string = preg_replace('/[[:space:]]+/', ' ', $string);
$string = str_replace($spaced_punc, $un_spaced_punc, $string);
$string = preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $string);
$string = preg_replace('/(?<!\d),|,(?!\d{3})/', ', ', $string);
$string = preg_replace('/(\.)([[:alpha:]]{2,})/', '$1 $2', $string);
$string = trim($string);
$string = preg_replace('/([\.!\?]\s+|\A)(\w)/e', '"$1" . strtoupper("$2")', $string);
if($string[strlen($string)-1]==','){
$string = substr($string, 0, -1).'.';
}
return $string;
}
如果您花时间来压缩此代码并创建仍会返回相同结果的内容,请分享!谢谢你,享受!
答案 1 :(得分:0)
我认为正则表达式应该是([^ 0-9] [。] [^ 0-9])[\ s] *
preg_replace('/([^0-9]['.$punctuation.'][^0-9])[\s]*/', '\1 ', $string)
答案 2 :(得分:0)
这有点复杂,但应该让你朝着正确的方向前进:
<?php
// The following finds all commas in $string and identifies which comma is preceded and followed by a number
$string = 'Hello, my name, is John,Doe. I have 3,425 cats.';
function strpos_r($haystack, $needle)
{
if(strlen($needle) > strlen($haystack))
trigger_error(sprintf("%s: length of argument 2 must be <= argument 1", __FUNCTION__), E_USER_WARNING);
$seeks = array();
while($seek = strrpos($haystack, $needle))
{
array_push($seeks, $seek);
$haystack = substr($haystack, 0, $seek);
}
return $seeks;
}
var_dump($commas = strpos_r($string, ',')); // gives you the location of all commas
for ($i = 0; i <= count($commas) - 1; $i++)
{
if (is_numeric($commas[$i] - 1) && is_numeric($commas[$i] + 1))
{
// this means the characters before and after a given comma are numeric
// don't add space (or delete the space) here
}
}