Пометка фраз в параграге - PullRequest
3 голосов
/ 24 июня 2010

Я использую PHP и ищу в своем тексте ссылки на другие разделы сайта, например:

I fell into the media industry aged 30, when David Mansfield, now on the board of
Ingenious Media, gave me my first break at Thames TV. From there, I worked at the
(now-defunct) Sunday Correspondent and IPC, before joining TDI, which became Viacom
and then CBS Outdoor. After 12 years in outdoor, I spent a year out doing overseas
outdoor consultancy work in Russia, Dubai and Spain, as well as launching the media 
CRM business, Media By Permission. I have been lucky enough to work across a range of 
media, but outdoor would definitely be my specialist subject on 'Mastermind'.

Я бы хотел связать Ingenious Media со страницей о Ingenious Media, но я также хотел бы связать все упоминания Media со страницей, связанной со СМИ.

Очевидно, я не хочу связывать слово Media внутри Ingenious Media

Как я могу сделать это без двойной ссылки на некоторые слова?

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 30 июня 2010

Шаг 1. Создайте новый массив, содержащий имена сущностей, которые вы хотите пометить, и упорядочьте его по длинному имени сущности до кратчайшего.сущности в тексте с уникальным токеном (например, ## . rand(100, 999) * rand(100, 999)).Мы делаем это, чтобы избежать создания ссылок вокруг сущностей, которые являются частью другой сущности.

Шаг 3. Создайте ссылку и сохраните ее в другом массиве, где ключом для каждой записи в массиве является уникальный токен и значениессылка, которую вы только что сделали.

Шаг 4. Переберите массив ссылок и замените токены в тексте ссылками, соответствующими токену в массиве.

0 голосов
/ 24 июня 2010

Может быть, если вы используете жадные регулярные выражения, чтобы максимально соответствовать фазе. посмотрите на эти ссылки http://www.exampledepot.com/egs/java.util.regex/Greedy.html и http://www.regular -expressions.info / repeat.html

0 голосов
/ 24 июня 2010
$string = '...your string from above....';

// Here we replace only "Media" when there is no "Ingenious " in front of it.
$string = preg_replace('#(?<!Ingenious )Media#', '<a href="media.html">Media</a>', $string);

// Here don't need to use a regex...
$string = str_replace('Ingenious Media', '<a href="ingenious_media.html">Ingenious Media</a>', $string);
echo $string;

Я уверен, что есть лучшее регулярное выражение, потому что всегда есть;) но так оно и работает, просто проверил:)

0 голосов
/ 24 июня 2010

Я не уверен, возможно ли это с помощью регулярного выражения.Я хотел бы сделать что-то вроде этого:

  1. поиск фразы
  2. проверить, находится ли фраза внутри ссылки (ищите справа тег, если он начинается тегом, чем вы, вероятно, не внутрии если это тэг eding, вы внутри)
  3. , если вы не внутри, замените
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...