Извлечение заглавных слов из строки - PullRequest
0 голосов
/ 12 июня 2019

Изменить Я разрешаю мою проблему. Это решение

$string = "Hello my Name is Paloppa. Im' 20 And? Hello! Words I  Io Man";     
// Word boundary before the first uppercase letter, followed by any alphanumeric character
preg_match_all( '/(?<!^)\b[A-Z][a-z]{1,}\b(?!["!?.\\\'])/', $string, $matches);
print_r( $matches[0] );

Теперь у меня есть еще один вопрос

Каждый раз, когда он находит слово, слово вставляется в позицию массива.

Если у меня есть эта фраза «Как тебя зовут и фамилия? Мое имя и фамилия» - это Паоло Селио и Серия А Иим 25 Спасибо Бро Чао » это мой код

    $string = "Whats is your Name and Surname? My Name And Surname' is Paolo Celio and Serie A Iim 25 Thanksbro Bro Ciao";     
// Word boundary before the first uppercase letter, followed by any alphanumeric character
preg_match_all( '/(?<!^)\b([A-Z][a-z]+ +){1,}\b(?!["!?.\\\'])/', $string, $matches);
print_r( $matches[0] );

вывод следующий

Array ( 
        [0] => Name 
        [1] => Name And Surname 
        [2] => Paolo Celio 
        [3] => Serie 
        [4] => Iim 
        [5] => Thanksbro Bro 
       )

Почему он не присоединяется к Серии А, а не печатает А? Почему последнее слово не в выводе?

Спасибо

EDIT Я решаю свою проблему, это мой REGEX

preg_match_all('/(?<!^)\b[A-Z]([a-z0-9A-Z]| [A-Z]){1,}\b(?!["!?.\\\'])/', $string, $matches);

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Вы можете использовать ..

<?php
      $test="the Quick brown Fox jumps Over the Lazy Dog";
      preg_match_all("/[A-Z][a-z]*/",$test,$op);
      $output = implode(' ',$op[0]);
      echo $output;
?>
0 голосов
/ 12 июня 2019

Это немного сложно, когда дело доходит до крайних случаев, но мы бы просто определили два класса char на основе наших желаемых выходов и входных данных, возможно, с границей слова, с выражением, похожим на:

(?=[^I'])\b([A-Z][a-z'é]+)\b

, и мы расширим его в зависимости от наших случаев.

Демо

Test

$re = '/(?=[^I\'])\b([A-Z][a-z\'é]+)\b/m';
$str = 'Hello my name is Paloppa. I\'m 20 And i love Football.
Hello my name is Chloé. I\'m 20 And i love Football.
Hello my name is Renée O\'neal. I\'m 20 And i love Football.';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 12 июня 2019

Вы можете использовать самый быстрый способ.

$test="Hi There this Is my First Job";
preg_match_all('/[A-Z][a-z]*/', $test, $matches, PREG_OFFSET_CAPTURE);

$res=array();

foreach( $matches[0] as $key=> $value){

    $res[]=$value[0];
}

print_r($res);

ВЫХОД:

  Array
(
    [0] => Hi
    [1] => There
    [2] => Is
    [3] => First
    [4] => Job
)

DEMO

0 голосов
/ 12 июня 2019

Чтобы извлечь полные слова, вам нужно использовать границы слов и классы символов, чтобы соответствовать оставшейся части слова, и использовать lookbehinds, чтобы исключить предыдущий контент:

$string = "Hello my Name is Paloppa. I'm 20 And? Hello! Words' Man";     
// Word boundary before the first uppercase letter, followed by any alphanumeric character
preg_match_all( '/(?<!^)(?<!\. )\b[A-Z][a-zA-Z]*\b(?!["!?\\\'])/', $string, $matches);
print_r( $matches[0] );

Если вы хотите использовать только заглавные слова, исключая слова MixedCase, замените [a-zA-Z] на [a-z].

Демо здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...