Regex, чтобы удалить все ДО и ПОСЛЕ буквы или цифры в строке - PullRequest
1 голос
/ 15 февраля 2020

Я создаю функцию, используя PHP для очистки строки имени.

Итак, у меня есть такие имена:

$name_1 = ' \'Brian    O\'Ril"*ley';
$name_2 = ' \'   " José Sant\'Anna';

# Output expected:
# Brian O'Rilley
# José Sant'Anna

Мой код функции:

function cleanName($string)
{
  # --------------------------------------------------
  # Remove everything before first letter and after last letter
  # --------------------------------------------------
  $string = preg_replace('/^[^A-Za-z0-9]+/','',$string);
  # --------------------------------------------------
  # Clean spaces
  # --------------------------------------------------
  $string = htmlentities($string,null,'utf-8');
  $string = str_replace(' ',' ',$string);
  $string = preg_replace('!\s+!',' ',$string);
  $string = html_entity_decode($string);
  # --------------------------------------------------
  # Replace quotes
  # --------------------------------------------------
  $string = str_replace(array('`','´','´´','``','"'),'\'',$string);
  $string = preg_replace("/'{2,}/","'",$string);
  # --------------------------------------------------
  # Remove everything but letters, single spaces, simple quotes, and ISO-8859-1 characters
  # --------------------------------------------------
  $string = preg_replace('/[^A-Za-z0-9 \'\xC0-\xD6\xD8-\xF6\xF8-\xFF]+/u','',$string);
  # --------------------------------------------------
  # Upper case on fisrt letters
  # --------------------------------------------------
  $string = ucwords(strtolower($string));
  # --------------------------------------------------
  # Output
  # --------------------------------------------------
  return $string;
}

Код выполняет почти все, что мне нужно, НО:

# This one only removes BEFORE - I also need to remove AFTER
$string = preg_replace('/^[^A-Za-z0-9]+/','',$string);

Я действительно изо всех сил пытаюсь найти способ удалить что-либо после последней буквы / цифры.

Может ли кто-нибудь помочь мне с этим? Если до и после он находится на одном регулярном выражении, даже лучше. Любые другие предложения по улучшению моего кода приветствуются!

Спасибо

1 Ответ

0 голосов
/ 16 февраля 2020

Попробуйте:

$string = 'abc87#@-';
echo preg_replace('/^([a-zA-Z0-9]*).*$/', '$1', $string);

Отпечатки:

abc87

Идея состоит в том, что при сканировании строки abc87#@-, abc87 становится группой захвата 1, а #@- - всем иначе (т.е. .*). Таким образом, регулярное выражение соответствует всей строке, и поэтому вы заменяете всю строку просто захватить группу 1.

...