请看这个:
如您所见,regex101 中只有 一个 匹配,但浏览器会匹配 两个 相同的单词。那么为什么 regex101 不能匹配第二个词呢?无论如何,我需要匹配这两个词 (或更多,如果存在的话)。
注意它与 g 标志无关。因为我在 fiddle 中使用过它。
这是 fiddle
最佳答案
处理这样的文本很难供以后使用。根据@Wiktor 的解决方案,您必须找到每个字母的不同表示形式,才能将搜索词从 مجلس 更改为 احمدی نژاد 等其他内容。
这就是为什么 normalization过程派上用场:
Normalization is a process that involves transforming characters and sequences of characters into a formally-defined underlying representation. This process is most important when text needs to be compared for sorting and searching, but it is also used when storing text to ensure that the text is stored in a consistent representation.
我们需要首先使用 Normalizer::normalize() 规范化我们的输入字符串然后在不对正则表达式进行任何更改的情况下,我们可以安全地对其运行 preg_match_all:
<?php
$text = <<< 'STR'
یک نماینده مجلس عنوان کرد: ﺩﺭ ﺩﻭﺭﻩ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﻣﺮﺩﻡ ﺩﺭ
ﺭﻓﺎﻩ ﺑﻮﺩﻧﺪ !/دولت سابق تنها دولتی که پس از انقلاب به مردم خدمت کرد! ﻳﻚ
ﻧﻤﺎﯾﻨﺪﻩ ﮔﺮﻭﻩ ﭘﺎﻳﺪﺍﺭی دﺭ ﻣﺠﻠﺲ ﺷﻮﺭﺍﯼ ﺍﺳﻼﻣﯽ ﺩﺭ ﭘﺎﺳﺦ ﺑﻪ ﺳﺆﺍﻟﯽ ﺩﺭ ﻣﻮﺭﺩ
ﺑﺎﺯﮔﺸﺖ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﻪ ﻋﺮﺻﻪ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺍﻇﻬﺎﺭ ﺩﺍﺷﺖ : ﻣﺎ ﺍﻣﯿﺪﻭﺍﺭﯾﻢ ﺍﯾﻦ ﺍﺗﻔﺎﻕ
ﺑﯿﻔﺘﺪ ﻭ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﺮﺍﯼ ﺷﺮﮐﺖ ﺩﺭ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺣﺎﺿﺮ ﺷﻮﺩ چرا که دولت وی تنها
دولتی است که پس از انقلاب به مردم خدمت کرده است.
STR;
$normalizedText = normalizer_normalize( $text , Normalizer::NFKC );
preg_match_all('~مجلس~', $normalizedText, $matches);
print_r($matches);
输出:
Array
(
[0] => Array
(
[0] => مجلس
[1] => مجلس
)
)
注意:需要启用 php_intl.dll 扩展。
关于php - 为什么模式匹配一个词,而有两个相同的词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43678364/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput